这是iPhone 4上的OpenGL。
我使用光和材料绘制场景。这是我的代码片段: 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显示它,但其余的组合显示白色。任何人都可以向我解释一下吗?
答案 0 :(得分:1)
这是因为顺时针
10.090面部剔除如何工作?为什么它不使用表面法线?
OpenGL面部剔除计算窗口坐标空间中填充图元的有符号区域。当窗口坐标为逆时针顺序时,有符号区域为正,顺时针方向为负。应用程序可以使用glFrontFace()来指定逆时针或顺时针的顺序,将其解释为前向或后向基元。应用程序可以通过调用glCullFace()指定剔除前面或后面。最后,必须通过调用glEnable(GL_CULL_FACE)启用面部剔除;
OpenGL使用原始窗口空间投影来确定面部剔除有两个原因。为了创建有趣的光照效果,通常需要指定与被近似表面不正交的法线。如果将这些法线用于面部剔除,则可能会导致某些基元被错误地剔除。此外,点积剔除方案可能需要矩阵求逆,这并不总是可行的(即,在矩阵是单数的情况下),而DC空间中的有符号区域总是被定义。
但是,一些OpenGL实现支持GL_EXT_ cull_vertex扩展。如果存在此扩展,则应用程序可以在对象空间中指定均匀的眼睛位置。基于当前法线的点积和从顶点到眼睛的矢量,顶点被标记为剔除。如果基元的所有顶点都被剔除,则不会渲染基元。在许多情况下,使用此扩展程序
来自here
您也可以阅读here