Opengl es GLMATERIALV不为我工作

Opengl es GLMATERIALV不为我工作,opengl-es,Opengl Es,这是iPhone4上的OpenGL Im使用灯光和材质绘制场景。以下是我的代码片段: glMatrixMode(GL_投影); glLoadIdentity(); GLFRUSTOMF(-1,1,-1,1,-1,1) 问题是,我看到的不是蓝色的漫反射颜色,而是白色。如果我旋转模型的侧面,它会消失,但我不明白为什么它不使用我的蓝色 顺便说一句,如果我将glMaterialfv(GL_FRONT,GL_DIFFUSE,blueColor)更改为glMaterialfv(GL_FRONT,GL_BAC

这是iPhone4上的OpenGL

Im使用灯光和材质绘制场景。以下是我的代码片段: glMatrixMode(GL_投影); glLoadIdentity(); GLFRUSTOMF(-1,1,-1,1,-1,1)

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


顺便说一句,如果我将glMaterialfv(GL_FRONT,GL_DIFFUSE,blueColor)更改为glMaterialfv(GL_FRONT,GL_BACK,GL_DIFFUSE,blueColor),那么我确实看到了蓝色。如果我使用glmateriallv(GL_FRONT,GL_DIFFUSE,blueColor);然后是glMaterialfv(GL_BACK,GL_DIFFUSE,blueColor);我又看到了白色。所以它看起来像是GL_FRONT_和_BACK显示的,但其余的组合显示为白色。有人能给我解释一下吗?

这是因为顺时针方向

10.090面部剔除是如何工作的?为什么不使用曲面法线

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

OpenGL使用原语的窗口空间投影来确定面剔除,原因有两个。要创建有趣的照明效果,通常需要指定与近似曲面不正交的法线。如果将这些法线用于面剔除,可能会导致某些基本体被错误剔除。此外,点积剔除方案可能需要矩阵求逆,这并不总是可能的(即,在矩阵奇异的情况下),而DC空间中的有符号区域总是被定义的

但是,一些OpenGL实现支持GL_EXT_cull_顶点扩展。如果存在此扩展,则应用程序可以指定对象空间中的同质眼睛位置。根据当前法线与从顶点到眼睛的向量的点积,顶点标记为剔除。如果剔除了基本体的所有顶点,则不会渲染该基本体。在许多情况下,使用此扩展


你也可以读到这是因为顺时针方向

10.090面部剔除是如何工作的?为什么不使用曲面法线

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

OpenGL使用原语的窗口空间投影来确定面剔除,原因有两个。要创建有趣的照明效果,通常需要指定与近似曲面不正交的法线。如果将这些法线用于面剔除,可能会导致某些基本体被错误剔除。此外,点积剔除方案可能需要矩阵求逆,这并不总是可能的(即,在矩阵奇异的情况下),而DC空间中的有符号区域总是被定义的

但是,一些OpenGL实现支持GL_EXT_cull_顶点扩展。如果存在此扩展,则应用程序可以指定对象空间中的同质眼睛位置。根据当前法线与从顶点到眼睛的向量的点积,顶点标记为剔除。如果剔除了基本体的所有顶点,则不会渲染该基本体。在许多情况下,使用此扩展


您也可以阅读

正如您在我的代码中看到的那样,我指定了剔除glEnable(GL_CULL_FACE)。如果我的三角形方向不对,它不是看不见的吗?无论如何,我做了两个三角形。一个CCW和一个CW指令。无论我使用什么样的剔除:glFrontFace中的GL_CW或GL_CCW,我总是看到两个三角形中的一个(因为它们的方向相反),但始终是白色。这可能取决于照明?例如,强光。试着改变光线方向和三角形区域之间的角度?如果是这样的话,前面或前面和后面会有相同的结果-白光。不管怎样,我试着用弱光,但没有用。我会扫描我的代码。也许我在OGL中设置了一些参数来分解它。谢谢你的帮助。顺便说一句,我忘了一个大细节。它是iPhone上的OpenGL。不知道这是否有什么区别。终于找到了问题所在。加载模型时,我正在对其进行规范化(拟合到1x1x1的框中),因此我正在使用缩放设置模型矩阵。作为缩放的结果,它会影响法线,因为在大多数情况下,我会缩小比例,使所有模型看起来都非常明亮。现在一切都好了。感谢您的帮助。正如您在我的代码中看到的,我指定了剔除glEnable(GL_CULL_FACE)。如果我的三角形方向不对,它不是看不见的吗?无论如何,我做了两个三角形。一个CCW和一个CW指令。无论我使用什么样的剔除:glFrontFace中的GL_CW或GL_CCW,我总是看到两个三角形中的一个(因为它们的方向相反),但始终是白色。这可能取决于照明?例如,强光。试着改变光线方向和三角形区域之间的角度?如果是这样的话,前面或前面和后面会有相同的结果-白光。不管怎样,我试着用弱光,但没有用。我会扫描我的代码。也许我在OGL中设置了一些参数来分解它。谢谢你的帮助。顺便说一句,我忘了一个大细节。它是iPhone上的OpenGL。不知道
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);