GL_CULL_FACE 从前面隐藏一个三角形

GL_CULL_FACE hides one triangle from the front

我 运行 遇到了使用 C++ 和 OpenGL(GLFW 和 GLAD)的问题。当我使用 GL_CULL_FACE 时,它只隐藏了一个三角形,并且从我的立方体前面隐藏了它。如果我使用 GL_FRONT 或 GL_BACK,会发生同样的事情,但它只显示相反的三角形。

这些是我目前使用的顶点和索引:

static GLfloat vertices[] = {
        // front face
        0.5, 0.5, -0.5,   // 0
        -0.5, 0.5, -0.5,  // 1
        -0.5, -0.5, -0.5, // 2
        0.5, -0.5, -0.5,  // 3
        // right face
        0.5, 0.5, -0.5,  // 4
        0.5, 0.5, 0.5,   // 5
        0.5, -0.5, 0.5,  // 6
        0.5, -0.5, -0.5, // 7
        // left face
        -0.5, 0.5, -0.5,  // 8
        -0.5, 0.5, 0.5,   // 9
        -0.5, -0.5, 0.5,  // 10
        -0.5, -0.5, -0.5, // 11
        // back face
        0.5, 0.5, 0.5,   // 12
        -0.5, 0.5, 0.5,  // 13
        -0.5, -0.5, 0.5, // 14
        0.5, -0.5, 0.5,  // 15
        // top face
        0.5, 0.5, -0.5,  // 16
        -0.5, 0.5, -0.5, // 17
        0.5, 0.5, 0.5,   // 18
        -0.5, 0.5, 0.5,  // 19
        // bottom face
        0.5, -0.5, -0.5,  // 20
        -0.5, -0.5, -0.5, // 21
        0.5, -0.5, 0.5,   // 22
        -0.5, -0.5, 0.5,  // 23
    };

    static GLuint indices[] = {
        20, 23, 22, 
        23, 21, 20, 
        16, 19, 18, 
        19, 17, 16, 
        12, 14, 15, 
        14, 13, 12, 
        8, 10, 11, 
        10, 9, 8, 
        4, 6, 7, 
        6, 5, 4, 
        0, 2, 3, 
        2, 1, 0
    };

这就是我绘制所有内容的方式:

for (int x = 0; x < 50; x++)
        {
            for (int z = 0; z < 50; z++)
            {
                camera.Model = translate(mat4(1.0), vec3(x, 0, z));

                glUniformMatrix4fv(matrixID, 1, GL_FALSE, &(camera.Projection * camera.View * camera.Model)[0][0]);

                glDrawElements(GL_TRIANGLES, sizeof(indices), GL_UNSIGNED_INT, 0);
            }
        }

这些是我的缓冲区:

GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    GLuint indicesbuffer;
    glGenBuffers(1, &indicesbuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

我该如何解决这个问题?

启用Face Culling时,所有三角形的缠绕顺序必须相同。对于封闭的 three-dimensional 体积,如果从网格外部看所有三角形具有相同的缠绕顺序,则三角形的缠绕顺序相同。因此,如果您从一侧看网格,背面的缠绕顺序与正面的缠绕顺序不同。你的三角形的缠绕顺序是混合的。有的是顺时针的,有的是逆时针的。
例如:索引为 0, 2, 32, 1, 0 的三角形具有不同的缠绕顺序。但是,索引为 0, 2, 30, 1, 2 的三角形具有相同的缠绕顺序。

您的网格定义不一致。以你的'top'脸为例,你的一个三角形是按顺时针(CW)顺序定义的,另一个是counter-clockwise(CCW):

你应该解决这个问题。始终坚持 CCW:

除此之外,您的一些面部顶点按 C 顺序编号,一些按 Z 顺序编号。这本身不是问题,但会让人更加困惑。