- 仔细启用颜色材料
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