OpenGL启用面剔除后立方体底面无法渲染的问题求助
问题:启用OpenGL面剔除后立方体底面无法显示
使用C++结合OpenGL,以SFML替代GLFW绘制立方体。未启用面剔除时渲染正常,但启用面剔除后,即便相机朝向立方体底面,该面也无法显示。
相关代码
立方体顶点纹理数据
GLfloat vertices[] = { // Front face //Texture Coordinates -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, // Back face -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, // Left face -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f, -1.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, // Right face 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, // Top face -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, // Bottom face -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f };
立方体索引数据
GLuint indices[] = { // Front face 0, 1, 2, 2, 3, 0, // Back face 4, 5, 6, 6, 7, 4, // Left face 8, 9, 10, 10, 11, 8, // Right face 12, 13, 14, 14, 15, 12, // Top face 16, 17, 18, 18, 19, 16, // Bottom face 20, 21, 22, 22, 23, 20 };
面剔除设置
//Face culling glEnable(GL_CULL_FACE); //Cull settings glCullFace(GL_FRONT); glFrontFace(GL_CW);
视角情况
- 视角1:可见立方体3个面
- 视角2:相机朝向立方体底面时,底面完全不可见
解决方案
问题核心是底面的顶点环绕方向与其他面不一致,导致面剔除规则错误剔除了底面。
你设置了glFrontFace(GL_CW)(顺时针为正面)和glCullFace(GL_FRONT)(剔除正面),要求所有面从立方体外部观察时顶点顺序均为顺时针,这样背面会被保留显示。但当前底面的索引顺序,从外部(上方)观察时为逆时针,导致相机朝向底面时,该面被错误识别为正面进而被剔除。
修正方式
调整底面的索引顺序,使其与其他面统一为顺时针环绕:
// 修改后的底面索引 // Bottom face 20, 23, 22, 22, 21, 20
如果不想修改索引,也可以调整面剔除参数为glCullFace(GL_BACK)(剔除背面,OpenGL默认行为),但统一所有面的环绕方向是更规范的做法,能避免后续类似问题。
内容的提问来源于stack exchange,提问作者Shloak
相关产品推荐
相关产品推荐

