2015-09-28 65 views
1

我打算繪製一箇中心有孔的矩形。我正在嘗試使用模板測試,但我無法使其工作。你可以在下面看到我是如何做到的。OpenGL - 在一個矩形中的模板測試

glEnable(GL_STENCIL_TEST); 
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE); 
glDepthMask(GL_FALSE); 
glStencilFunc(GL_ALWAYS, 2, ~0); 
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
// Draw the rectangle here 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 2, ~0); 
glStencilOp(GL_INCR, GL_INCR, GL_INCR); 

我在做什麼錯在這裏?任何幫助將不勝感激! :)

+0

這只是在模板緩衝區中設置'2'(假設它足夠深),然後是「繪製這裏」代碼,無論它在哪裏繪製都將寫入「2」,然後設置模板以僅繪製在哪裏寫了'2'。這與文字說明不符。你能展示一個更完整的(僞)代碼示例嗎? – Angew

+0

@Angew - 這是我用於模板測試的唯一代碼。我對此很陌生,我真的很想知道應該怎麼做。 「draw here」只是緩衝區到opengl的簡單綁定,並調用glDrawArrays。沒有什麼我可以給你從這裏。 – zyneragetro

回答

1

我假設你的情況是你已經有了一些在framebuffer中繪製的東西,現在你想繪製一個帶有洞的矩形,這樣它就不會覆蓋洞下面的東西, t在非孔部分下面。

邏輯上,這意味着首先繪製到模版緩衝器,然後用模板測試排除那些片段繪製矩形時。

在代碼中,它看起來是這樣的:

glEnable(GL_STENCIL_TEST); 

// Fill stencil buffer with 0's 
glClearStencil(0); 
glClear(GL_STENCIL_BUFFER_BIT); 

// Write 1's into stencil buffer where the hole will be 
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE); 
glDepthMask(GL_FALSE); 
glStencilFunc(GL_ALWAYS, 1, ~0); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawHoleShape(); 

// Draw rectangle, masking out fragments with 1's in the stencil buffer 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glDepthMask(GL_TRUE); 
glStencilFunc(GL_NOTEQUAL, 1, ~0); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
drawRectangle(); 

// Cleanup, if necessary 
glDisable(GL_STENCIL_TEST); 

當然,你可以使用2(或任何其他模板位/值),而不是1

+0

謝謝你的例子。我會先試試:) – zyneragetro

+0

對不起,遲到的迴應。我遵循上面的算法,看起來無論我在drawholeshape中畫什麼都消失了,唯一能看到的仍然是整個矩形。 – zyneragetro

+0

@zyneragetro我剛剛發生了一些事情 - 你是否真的在你的上下文中創建了一個模板緩衝區?例如。當使用GLUT時,可以通過在'glutInitDisplayMode'的參數中加入'GLUT_STENCIL'來完成。 – Angew