GL_CULL_FACE使所有对象消失

时间:2012-03-22 22:06:52

标签: opengl glsl 3d opengl-3

我试图在openGL3.3中创建一些简单的多边形。我有两种具有以下属性的对象:

对象1 - 10个顶点(下面按顺序列出)存储在GL_ARRAY_BUFFER并使用GL_TRIANGLE_FAN

v x y z w  
v 0.0 0.0 1.0 1.0  
v 0.0 1.0 0.1 1.0  
v 0.71 0.71 0.1 1.0  
v 1.0 0.0 0.1 1.0  
v 0.71 -0.71 0.1 1.0  
v 0.0 -1.0 0.1 1.0  
v -0.71 -0.71 0.1 1.0  
v -1.0 0.0 0.1 1.0  
v -0.71 0.71 0.1 1.0  
v 0.0 1.0 0.1 1.0  

对象2 - 4个顶点(按顺序列出,按顺序排列)存储在GL_ARRAY_BUFFER并使用GL_TRIANGLE_STRIP

v x y z w  
v 0.0 0.0 0.0 1.0  
v 0.0 1.0 0.0 1.0  
v 1.0 0.0 0.0 1.0  
v 1.0 1.0 0.0 1.0  

我加载了64个Object1和4个Object2。使用glm::scale(20, 20, 0)缩放Object2。

当我尝试使用已禁用GL_CULL_FACEGL_DEPTH_TEST已启用glDepthFunc(GL_LESS)时尝试渲染这些内容时,一切正常。一旦我尝试启用GL_CULL_FACE,我得到的只是一个空白窗口。

其他一些有用的信息:
- 渲染顺序= 4 Object2后跟64 Object1的
- 相机 - glm::lookAt(glm::vec3(0.0f, 0.0f, 50.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));
- 透视 - glm::perspective(45.0f, 16.0f / 9.0f, 0.01f, 1000.0f);

我一直试图弄清楚为什么GL_CULL_FACE在过去几天不起作用但却不知道。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

这几乎总是由于多边形法线方向(每个三角形的三个顶点的右手规则)

尝试使用以下方法切换方向:

glCullFace(GL_BACK或GL_FRONT)

更多阅读here

答案 1 :(得分:3)

您指定了哪种剔除方向?当你创建一个多边形时,你可以相对于摄像机的视点顺时针或逆时针“旋转”顶点,你必须告诉OpenGL它应该剔除哪种类型。

正如您可能知道的那样,背面剔除是为了隐藏多边形背离相机,所以如果您有顺时针缠绕的面,这意味着当面向相机时逆时针顺时针顺时针方向,所以你告诉OpenGL剔除逆时针多边形。

我怀疑你正在剔除你想要看到的多边形:GL_BACK是默认的,所以将模式切换到GL_FRONT应该有效。 See the documentation for more info: http://www.opengl.org/sdk/docs/man/xhtml/glCullFace.xml