glMaterialfv对我不起作用

问题描述 投票:1回答:1

这是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显示了它,但其余的组合显示了白色。有人可以向我解释吗?

opengl-es
1个回答
1
投票

这是由于顺时针方向

10.090脸部剔除如何工作?为什么不使用表面法线?

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

OpenGL使用原始图元的窗口空间投影来确定人脸剔除,这有两个原因。为了创建有趣的照明效果,通常需要指定不正交于近似曲面的法线。如果将这些法线用于人脸剔除,则可能会导致某些图元被错误地剔除。同样,点积剔除方案可能需要矩阵求逆,这并非总是可能的(即,在矩阵为奇数的情况下),而DC空间中的有符号区域始终是定义的。

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

来自here

也可以阅读here

© www.soinside.com 2019 - 2024. All rights reserved.