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