我有一个没有纹理的三角形网格,但是有一个固定的颜色(蓝色)和 alpha(0.7f)。该网格是运行时生成的,并且法线是正确的。我发现在打开照明的情况下,我的对象的颜色会随着它在关卡中移动而发生变化。另外,灯光看起来也不对。当我绘制这个对象时,这是代码:
glEnable( GL_COLOR_MATERIAL );
float matColor[] = { cur->GetRed(), cur->GetGreen(), cur->GetBlue(), cur->GetAlpha() };
float white[] = { 0.3f, 0.3f, 0.3f, 1.0f };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matColor);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
我注意到的另一件奇怪的事情是,当我禁用GL_FRONT_AND_BACK
并仅使用GL_FRONT
or时,照明会失败GL_BACK
。这是我的照明设置(在渲染器开始时完成一次):
m_lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
m_lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
m_lightPosition[] = { 0.0f, 1200.0f, 0.0f, 1.0f };
glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient);
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition);
编辑:我做了很多工作来使法线“更”正确(因为我自己生成了表面),但是对象的颜色仍然会根据它的位置而变化。为什么是这样?openGL 是否有一些我不知道的特殊环境混合?
编辑:原来颜色变化是因为以前的纹理在纹理堆栈上,即使它没有被绘制,glMaterialfv
也正在与它混合。