2011-12-01 69 views
1

这是iPhone 4上的OpenGL。glMaterialfv不适用于我

使用光线和材料绘制场景。这里是我的代码片段: glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustumf(-1,1,-1,1,-1,1);

CGFloat ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
CGFloat diffuseLight[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
CGFloat direction[] = { 0.0f, 0.0f, -20.0f, 0 }; 

glEnable(GL_LIGHT0); 
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); 
glLightfv(GL_LIGHT0, GL_POSITION, direction); 


glShadeModel(GL_FLAT); 
glEnable(GL_LIGHTING); 
glDisable(GL_COLOR_MATERIAL); 

float blankColor[4] = {0,0,0,1}; 
float whiteColor[4] = {1,1,1,1}; 
float blueColor[4] = {0,0,1,1}; 

glMaterialfv(GL_FRONT, GL_DIFFUSE, blueColor); 

glEnable(GL_CULL_FACE); 

glVertexPointer(3, GL_FLOAT, 0, verts.pdata); 
    glEnableClientState(GL_VERTEX_ARRAY); 

glNormalPointer(GL_FLOAT, 0, normals.pdata); 
glEnableClientState(GL_NORMAL_ARRAY); 

glDrawArrays (GL_TRIANGLES, 0, verts.size/3); 

问题是,不是看到蓝色漫反射颜色,我看到它是白色的。如果我旋转模型的一面,它会淡出,但我不明白为什么它不使用我的蓝色。

如果我将glMaterialfv(GL_FRONT,GL_DIFFUSE,blueColor)更改为glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,blueColor),那么我确实看到蓝色。如果我这样做glMaterialfv(GL_FRONT,GL_DIFFUSE,blueColor);然后glMaterialfv(GL_BACK,GL_DIFFUSE,blueColor);我再次看到白色。所以它看起来像GL_FRONT_AND_BACK显示它,但其余组合显示白色。任何人都可以向我解释?

回答

1

这是因为顺时针

10.090如何面对扑杀工作的?为什么不使用曲面法线?

OpenGL面部剔除计算窗口坐标空间中填充图元的有符号区域。当窗口坐标逆时针顺序时,签名区域为正,顺时针时为负。应用程序可以使用glFrontFace()指定逆时针或顺时针的顺序,将其解释为前向或后向原语。应用程序可以通过调用glCullFace()来指定剔选正面或背面。最后,必须通过调用glEnable(GL_CULL_FACE)来启用面部剔除; 。

OpenGL使用您的图元的窗口空间投影来确定面部剔除有两个原因。为了创建有趣的光照效果,通常需要指定与要近似的表面不正交的法线。如果使用这些法线进行脸部剔除,可能会导致一些原始图像被错误地剔除。而且,点积剔除方案可能需要矩阵求逆,这并不总是可能的(即,在矩阵是单数的情况下),而DC空间中的有符号区域总是被定义的。

但是,一些OpenGL实现支持GL_EXT_ cull_vertex扩展。如果此扩展名存在,应用程序可能会在对象空间中指定一个均匀的眼睛位置。基于当前法线与从顶点到眼睛的矢量的点积,将顶点标记为剔除。如果一个图元的所有顶点被剔除,则该图元不会被渲染。在许多情况下,使用此扩展

here

您还可以阅读here

+0

正如你在我的代码中看到我指定剔除glEnable(GL_CULL_FACE)。如果我的三角形是错误的方向,它不会隐形吗?无论如何,我做了2个三角形。一个CCW和一个CW顺序。无论我使用什么样的选择:glFrontFace中的GL_CW或GL_CCW我总是看到2个三角形中的一个(因为它们的方向相反),但始终是白色。 –

+0

可能取决于照明?例如强光。尝试改变光线方向和三角形区域之间的角度? –

+0

如果是这样,那么FRONT或FRONT_AND_BACK会有相同的结果 - 白光。无论如何,我尝试弱光,它并没有帮助。 Il扫描我的代码。也许我在OGL的某个地方设置了一些参数来分解它。感谢您的帮助。 –