我想使用模板缓冲区创建一个带有窗口的墙。 我的代码如下所示:
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);
但这没有用,我得到了整个填充墙没有窗口,任何建议??
答案 0 :(得分:1)
确保从窗口系统请求带有模板缓冲区的OpenGL上下文。除非您特别要求,否则您可能默认不会获得一个。
这是使用example的GLUT。您需要查看glutInitDisplayMode()
来电。
这是使用原始Win32的另一个example。 PIXELFORMATDESCRIPTOR
位是重要的部分。
glXChooseVisual()
可能就是您想看的地方。
如果您想要跨平台上下文管理,我建议SDL。
答案 1 :(得分:1)
我没有测试过您的代码,但我认为您应该更改
glStencilFunc(GL_NOTEQUAL, 1, 1);
到
glStencilFunc(GL_EQUAL, 1, 1);