You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:57:00