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, 3
和 2, 1, 0
的三角形具有不同的缠绕顺序。但是,索引为 0, 2, 3
和 0, 1, 2
的三角形具有相同的缠绕顺序。
您的网格定义不一致。以你的'top'脸为例,你的一个三角形是按顺时针(CW)顺序定义的,另一个是counter-clockwise(CCW):
你应该解决这个问题。始终坚持 CCW:
除此之外,您的一些面部顶点按 C 顺序编号,一些按 Z 顺序编号。这本身不是问题,但会让人更加困惑。
我 运行 遇到了使用 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, 3
和 2, 1, 0
的三角形具有不同的缠绕顺序。但是,索引为 0, 2, 3
和 0, 1, 2
的三角形具有相同的缠绕顺序。
您的网格定义不一致。以你的'top'脸为例,你的一个三角形是按顺时针(CW)顺序定义的,另一个是counter-clockwise(CCW):
你应该解决这个问题。始终坚持 CCW:
除此之外,您的一些面部顶点按 C 顺序编号,一些按 Z 顺序编号。这本身不是问题,但会让人更加困惑。