2010-05-12 133 views
1

我想使用模板缓冲区在里面创建一个带有窗口的墙。 我的代码如下所示:OpenGl:模板缓冲区问题(Wall + Window)?

glEnable(GL_STENCIL_TEST); 
glClearStencil(0); 
glClear(GL_STENCIL_BUFFER_BIT); 
glStencilMask(1); 
glStencilFunc(GL_ALWAYS, 1, 1); 

glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
glDisable(GL_DEPTH_TEST); 
glColor3f(1,1,1); 

//Window 
glBegin(GL_POLYGON); 
glVertex3d(-5,0,-20); 
glVertex3d(-5,0,40); 
glVertex3d(-20,0,40); 
glVertex3d(-20,0,-20); 
glEnd(); 

glEnable(GL_DEPTH_TEST); 
glStencilFunc(GL_NOTEQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glEnable(GL_CLIP_PLANE0);      
glClipPlane(GL_CLIP_PLANE0, eqr); 
glBindTexture(GL_TEXTURE_2D,texture[1]); 
glBegin(GL_POLYGON); 
glNormal3f(0.0f,-1.0,0.0f); 

//Wall 
glTexCoord2f(0.0f, 0.0f);glVertex3d(20,0,-20); 
glTexCoord2f(1.0f, 0.0f);glVertex3d(20,0,40); 
glTexCoord2f(1.0f, 0.0f);glVertex3d(-20,0,40); 
glTexCoord2f(1.0f, 0.0f);glVertex3d(-20,0,-20); 

glEnd(); 
glDisable(GL_STENCIL_TEST); 

但是,这并不奏效,我得到了整个填充墙没有它的窗口,有什么建议?

回答

1

确保您从窗口系统请求带有模板缓冲区的OpenGL上下文。除非您明确要求,否则您可能不会默认获得一个。

这是example使用GLUT。您需要查看glutInitDisplayMode()调用。

这是另一个使用原始Win32的examplePIXELFORMATDESCRIPTOR位是重要部分。

glXChooseVisual()如果您使用X11,可能是您想要看的地方。

如果您想跨平台上下文管理,我会推荐SDL

1

我没有测试你的代码,但我认为你应该改变

glStencilFunc(GL_NOTEQUAL, 1, 1); 

glStencilFunc(GL_EQUAL, 1, 1);