我正在用 SFML 代替 GLFW 在 OpenGL C++ 中绘制立方体。立方体在没有面剔除的情况下被正确渲染,但在面剔除之后立方体的底面不可见。
我想要相机 - 立方体的正面被渲染,但即使相机面对它们,底面也不会被渲染。我的立方体顶点数据和纹理数据:
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);
按预期工作。
你的盒子的顶部和底部有按 CCW 顺序定义的顶点。
如果以 CW 顺序定义的顶点被认为是正面的,当您从上方看到盒子的顶部时,您看到的是启用了渲染的背面,这就是您看到盒子顶部的原因。
当您查看盒子下方的盒子底部时,您看不到那一侧,因为它被视为正面 - 渲染被禁用。
只需将盒子底部的索引顺序更改为 CW 顺序:
// Bottom face
21, 20, 23,
21, 23, 22