如何在OpenGL中爲金屬(如銀)設置材質?有誰知道?如何在OpenGL中設置金屬材質(如銀色)?
回答
如果您檢查this site,您可以找到一系列不同的材料設置,旨在模擬各種材質,包括銀色。但是,正如其他人在評論中所說的那樣,請記住,OpenGL使用這種材質設置所做的Phong着色很難以真實的方式呈現某些真實世界的物質,特別是像銀色這樣的反射物質。但是該網站的材料設置應該給你一些銀色的東西,至少在第一個近似值。 (請確保你在最後注意到將光澤度乘以128)
如何在OpenGL中爲金屬(如銀)設置材質?有誰知道?
如果你希望你的材料有時看起來像金屬一樣,你需要設置相應的漫反射,環境,鏡面反射和「光澤」參數。您可以調查3d編輯器的現有材料庫,如blender,並查看它們是如何實現的。這很便宜,但它也會看起來很便宜。通常,具有低GL_SHININESS值(3..12,我認爲?)的材料看起來「有點」像金屬表面。
如果你希望你的材質看起來更像金屬,但是在某些光照條件下,你需要編寫像素着色器,它將使用照片級真實紋理的銀色,額外的紋理貼圖來控制鏡面顏色和強度。只要照明條件被精心挑選,一個好的紋理可以讓你擺脫可怕而簡單的着色器。這就要求程序員具有GLSL的知識和一個好的藝術家來製作紋理,藝術家將變得更加重要 - 即使像像素phong這樣的非金屬着色器也可以通過手動調整來看起來像你想要的(進動可能會很無聊和乏味)。着色器本身只需要使用鏡面反射(任何鏡面反射)的每像素光照,正常映射支持和環境反射映射(使用菲涅耳術語支持)。將HDR用於弱反射拋光表面也將有所幫助。
如果你想要真正的和完美的銀,那麼你有麻煩,應該重新考慮。金屬表面具有「模糊」的反射,這可能是一個快速實施的難題,具體取決於您的硬件。另一個問題是,你必須非常仔細地研究金屬本身,檢查存在的每個金屬表面演示,閱讀GDC論文等。做研究,這可能需要花費很多時間/精力,並且最終不會得到回報,因爲最終結果很可能會有可怕的表現。重要的是,你不需要模擬真實的材料來使它看起來正確 - 你需要愚弄觀衆以爲這是銀子。
由於Solaraeus說,你可以做一個「材料」類來定義一個實物,例如:
#ifndef _MATERIAL
#define _MATERIAL
#include <GL/gl.h>
class material{
private:
GLfloat ambient_r;
GLfloat ambient_g;
GLfloat ambient_b;
GLfloat diffuse_r;
GLfloat diffuse_g;
GLfloat diffuse_b;
GLfloat specular_r;
GLfloat specular_g;
GLfloat specular_b;
public:
material(GLfloat ar, GLfloat ag, GLfloat ab, GLfloat dr, GLfloat dg, GLfloat db, GLfloat sr, GLfloat sg, GLfloat sb){
ambient_r=ar; ambient_g=ag; ambient_b=ab;
diffuse_r=dr; diffuse_g=dg; diffuse_b=db;
specular_r=sr; specular_g=sg; specular_b=sb;
}
void active(){
GLfloat ambient[]={ambient_r, ambient_g, ambient_b, 1.0};
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
GLfloat diffuse[]={diffuse_r, diffuse_g, diffuse_b};
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
GLfloat specular[]={specular_r, specular_g, specular_b};
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
}
};
#endif
後,您可以定義文件.H用幾種材料以備後用,例如:
#ifndef _MATERIALS
#define _MATERIALS
#include "material.h"
// ### specification of materials ### //
material turquesa(0.1, 0.18725, 0.1745, 0.396, 0.74151, 0.69102, 0.297254, 0.30829, 0.306678);
material esmeralda(0.0215, 0.1745, 0.0215, 0.07568, 0.61424, 0.07568, 0.633, 0.727811, 0.633);
material jade(0.135, 0.2225, 0.1575, 0.54, 0.89, 0.63, 0.316228, 0.316228, 0.316228);
material obsidian(0.05375, 0.05, 0.06625, 0.18275, 0.17, 0.22525, 0.332741, 0.328634, 0.346435);
//more and more...
#ENDIF
所以,你可以用它們任何地方,包括materials.h激活物質,當你需要它:
例子:
#include "materials.h"
...
...
turquesa.active();
glBegin(GL_TRIANGLES);
for(unsigned i=0; i<faces.size(); i++){
glNormal3f(x, y, z);
glVertex3f(x, y, z);
glVertex3f(x, y, z);
glVertex3f(x, y, z);
}
glEnd();
...
...
是比較容易,如果你想的對象。
高質量的金屬外觀可以使用PBR - 基於物理的渲染技術獲得。 基本上,PBR使用着色器和以下紋理輸入:
- 反照率(漫反射)顏色;
- 法線貼圖;
- 粗糙度 - 地圖表面粗糙度/平滑度;
- 金屬性 - 金屬/無金屬區域的地圖表面;
在網上有很多關於PBR的文章。可能最喜歡的是這個one。
此外,結合環境影響(立方體地圖或其他反射技術)突出了金屬效果。
- 1. 如何設置不屬於材質組件的材質角度材質
- 2. 如何在角度材質中設置圖標的顏色?
- 3. 角材質:如何設置floatPlaceholder從不
- 4. 角度材質 - 設置調色板
- 5. 在OpenGL中爲不同對象設置單獨的材質屬性
- 6. 如何在Helix Toolkit ViewPort中設置不反射光的材質?
- 7. 如何在材質UI中設置按鈕樣式
- 8. 如何在角度材質中設置按鈕CSS的樣式?
- 9. 將角質材質2主題設置爲黑色主題
- 10. 如何設置與主題顏色不同的gwt材質元素的顏色?
- 11. 如何設置文本顏色在OpenGL
- 12. 如何在OpenGL中一起繪製2D和3D材質?
- 13. Angular2材質佈局設置
- 14. 材質沒有顏色屬性'_TintColor'
- 15. 在OpenGL中瞭解Light與材質屬性
- 16. 如何設置Material UI中材質卡的最小高度?
- 17. 如何將材質設計風格設置爲禁用EditText(android)?
- 18. Android材質設計 - 材質動作
- 19. 如何設計材質UI滑塊
- 20. 更改材質設計AppCompat ActionBar顏色
- 21. 背景顏色變化材質設計
- 22. Angular 2材質 - 如何有條件地設置工具欄的顏色
- 23. 如何爲自定義着色器材質正確設置燈光
- 24. VS代碼:如何設置與Sublime相同的材質主題?
- 25. 角度材質2:如何設置日期而不關閉mdMenu
- 26. 用統一的C設置材質顏色#
- 27. 爲什麼角度材質會設置背景顏色?
- 28. 如何在加載Collada(dae)模型時在THREE.js中設置材質?
- 29. 計算材質顏色
- 30. 如何在angularjs材質設計中對齊文本
爲什麼不使用您在網上找到的金屬質感並將其應用於您的物體? – Chris911 2012-04-22 02:08:49
着色器+紋理..如果你感覺很勇敢,那麼光線追蹤也是如此。 – jli 2012-04-22 02:09:34
你不只是調用'glEnable(GL_METAL)'。模仿金屬或任何真實世界的物質是一件複雜的事情,它可以用各種方式近似以獲得不同程度的準確性。因此,如果不瞭解整體問題的範圍,就無法回答這個問題。 – 2012-04-22 02:16:24