2012-01-14 52 views
2

當前我正在繪製一個背景,然後一個透明三角形放入模板緩衝區,然後是一個藍色方塊,其中三角形未被繪製。我希望效果會是一個藍色的正方形,並且有一個暴露背景的三角孔。但是我所得到的只是一個繪製其他所有東西的黑色三角形。我想即時在廣場上獲得所需的效果,但模板也被應用於背景。opengl模板緩衝區 - 不完全正常工作

我的問題是我如何調整下面的代碼,讓背景通過廣場上的三角形孔顯示?

static void Draw(void) 
{ 
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

//big blue square 
glColor3ub(0,255,255); 
glBegin(GL_POLYGON); 
glVertex3i(5, 5, 0); 
glVertex3i(-5, 5, 0); 
glVertex3i(-5, -5, 0); 
glVertex3i(5, -5, 0); 
glEnd(); 

glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

/* transparent triangle */ 
glColor4ub(0.0f, 0.0f, 0.0f, 0.0f); 
glBegin(GL_POLYGON); 
glVertex3i(-4, -4, 0); 
glVertex3i(4, -4, 0); 
glVertex3i(0, 4, 0); 
glEnd(); 

glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_INCR, GL_KEEP, GL_DECR); 

glStencilFunc(GL_EQUAL, 2, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

/* blue square */ 
glColor3ub(0, 0, 200); 
glBegin(GL_POLYGON); 
glVertex3i(3, 3, 0); 
glVertex3i(-3, 3, 0); 
glVertex3i(-3, -3, 0); 
glVertex3i(3, -3, 0); 
glEnd(); 

if (doubleBuffer) { 
    glutSwapBuffers(); 
} else { 
    glFlush(); 
} 
} 

回答

5

問題之一:當之前繪製背景或者禁用模板測試,或使得通過片段(I電子書籍將其關閉)開關模板函數GL_ALWAYS。然後,你在之後設置兩個不同的模具修改,但不會,你打算做什麼。所以這裏的變化:

glDisable(GL_STENCIL_TEST); 
glStencilMask(0x0); 

draw_background(); 

glEnable(GL_STENCIL_TEST); 
glStencilMask(0x1); 
glStencilFunc(GL_ALWAYS, 0x1, 0x1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glDepthMask(GL_FALSE); 

draw_trangle(); 

glStencilFunc(GL_NOTEQUAL, 0x1, 0x1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glDepthMask(GL_TRUE); 

draw_blue_square(); 
+0

謝謝,但是這並沒有很好的工作。所有即將看到的是沒有三角形洞的背景上的正方形。有沒有關於我主要設置東西的方法? – 2012-01-14 12:47:22

+0

@westr:是的,可以。我也承認,我沒有測試該代碼。你可以把你的整個源代碼放在pastebin中。這允許我a)重現你的問題,並b)修復它。 – datenwolf 2012-01-14 14:12:39

+0

這裏雅去http://pastebin.com/636kyXU7 – 2012-01-14 14:16:23