2010-05-12 136 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);