- 仔細啓用顏色材料
OpenGL的色材特性提供了一種較不昂貴的方式來 變材料參數。啓用顏色材質後,材質 顏色會跟蹤當前顏色。這意味着您可以使用例行程序代替使用 相對昂貴的例程glMaterialfv
。
下面是使用的色彩材料特性來改變 漫反射顏色爲一個三角形的每個頂點的例子:
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glBegin(GL_TRIANGLES);
glColor3f(0.2, 0.5, 0.8);
glVertex3f(1.0, 0.0, 0.0);
glColor3f(0.3, 0.5, 0.6);
glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.4, 0.2, 0.2);
glVertex3f(1.0, 1.0, 0.0);
glEnd();
考慮如果glMaterialfv
需要更昂貴的代碼序列明確地使用是 :
GLfloat d1[] = { 0.2, 0.5, 0.8, 1.0 };
GLfloat d2[] = { 0.3, 0.5, 0.6, 1.0 };
GLfloat d3[] = { 0.4, 0.2, 0.2, 1.0 };
glBegin(GL_TRIANGLES);
glMaterialfv(GL_FRONT,GL_DIFFUSE,d1);
glVertex3f(1.0, 0.0, 0.0);
glMaterialfv(GL_FRONT,GL_DIFFUSE,d2);
glVertex3f(0.0, 0.0, 0.0);
glMaterialfv(GL_FRONT,GL_DIFFUSE,d3);
glVertex3f(1.0, 1.0, 0.0);
glEnd();
如果您正在渲染需要頻繁簡單材質 更改的對象,請嘗試使用顏色材質模式。但是,在啓用色彩材質模式時遇到了一個常見的陷阱。當啓用 色彩材質時,OpenGL會立即更改由色材狀態控制的材質 。考慮以下 一段代碼來初始化一個新創建的OpenGL渲染上下文:
GLfloat a[] = { 0.1, 0.1, 0.1, 1.0 };
glColor4f(1.0, 1.0, 1.0, 1.0);
glMaterialfv(GL_FRONT, GL_AMBIENT, a);
glEnable(GL_COLOR_MATERIAL); /* WARNING: Ambient and diffuse material latch immediately to the current color. */
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glColor3f(0.3, 0.5, 0.6);
將前環境和漫射材料的顏色是什麼狀態 執行上面的代碼片段後?雖然程序員可能有 打算環境材料狀態爲(0.1, 0.1, 0.1, 1.0)
和 漫反射材料狀態爲(0.3, 0.5, 0.6, 1.0)
,這不是 相當發生。
產生的漫反射材料狀態是程序員想要的, 但生成的環境材料狀態是相當意外的(1.0, 1.0, 1.0, 1.0)
。那是怎麼發生的?那麼請記住,啓用 後,色材模式立即開始跟蹤當前顏色。顏色材質設置的初始值爲 GL_FRONT_AND_BACK
和GL_AMBIENT_AND_DIFFUSE
(可能不是您期望的 !)。
由於啓用色料模式立即開始跟蹤當前顏色,環境和散射材料狀態均爲 更新爲(1.0, 1.0, 1.0, 1.0)
。請注意, 初始glMaterialfv
的效果丟失。接下來,更新顏色材質狀態爲 以更改正面漫反射材質。最後, glColor3f
調用將漫反射材料更改爲(0.3, 0.5, 0.6, 1.0)
。環境材料狀態最終爲(1.0, 1.0, 1.0, 1.0)
。
上述代碼片段中的問題是,在調用glColorMaterial
之前啓用了色材模式 。顏色材質模式 對於高效簡單的材質更改非常有效,但爲了避免以上陷阱,請務必在 之前注意設置glColorMaterial
您啓用GL_COLOR_MATERIAL
。
良好的相關鏈接https://sjbaker.org/steve/omniv/opengl_lighting.html – 2016-03-18 11:11:50