在OpenGL中启用照明时,为什么颜色会消失? 我在C++中用OpenGL API和GLUT.开发了一个图形应用程序。
为了添加照明,我在modelview矩阵中做了以下更改:在OpenGL中启用照明时,为什么颜色会消失? 我在C++中用OpenGL API和GLUT.开发了一个图形应用程序。,c++,opengl,glut,C++,Opengl,Glut,为了添加照明,我在modelview矩阵中做了以下更改: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); // Create light components. GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f }; GLfloat specularLight[] = { 0.5f, 0.5f, 0.5
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
// Create light components.
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position[] = { 0.0f, 0.0f, 0.0f, 1.0f };
// Assign created components to GL_LIGHT0.
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);
我相信灯光在很大程度上起作用,但是我的物体的颜色都消失了。我所看到的只是我整个身材的黑白轮廓
我想知道为什么会这样?试试glEnable(GL颜色材料)
见:
glmaterialsv
例程,您可以使用
glColor3f
例行程序
下面是一个使用颜色材质功能更改颜色的示例
三角形每个顶点的漫反射颜色:
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\u前和后
和GL\u环境和扩散
(可能不是什么
你预料到了!)
因为启用颜色材质模式会立即开始跟踪
当前颜色,环境光和漫反射材质状态均为
更新为(1.0、1.0、1.0、1.0)
。请注意
初始glmaterialsv
丢失。接下来,将显示颜色材质状态
更新为仅更改前漫反射材质。最后一点是
glColor3f
调用将漫反射材质更改为(0.3,0.5,,
0.6,1.0)
。环境材质状态最终为(1.0、1.0、1.0、1.0)
上面代码片段中的问题是颜色材质模式
在调用glColorMaterial
之前启用。颜色材质模式
对于高效简单的材质更改非常有效,但要避免
对于上述陷阱,请务必小心设置glColorMaterial
您可以启用GL\u颜色\u材质
启用照明时,顶点颜色不是由
glColor
或glColorPointer
设置的颜色确定的,而是由当前设置的材质颜色与使用照明计算的灯光颜色组合确定的
因此,为了更改对象的颜色,需要在渲染之前使用函数更改材质设置(默认情况下为漫反射灰色材质)。对于每种不同的灯光颜色(GL_DIFFUSE
,…),基本上都有相应的材质颜色,以及一些近似发光材质的附加属性(GL_EMISSION
)和控制材质粗糙度(GL_shiness
)。阅读一些有关OpenGL照明功能的介绍性材料,了解它们的工作原理
要快速地将代码从普通着色调整到照明(或启用逐顶点材质属性),可以使用颜色材质。通过调用glEnable(GL\u COLOR\u MATERIAL)
并使用设置适当的映射,您可以在更改当前顶点颜色时(使用glColor
或glColorPointer
)将OpenGL配置为更改特定的材质颜色。良好的相关链接