2012-07-06 99 views
0

我正在尋找一種方法來使用紋理蒙板我的整個視口。在我的情況下,我想使用方格黑白圖案(或任何2種顏色),只顯示場景中黑色的部分。Opengl ES2剪貼蒙版

要做到這一點的最好方法是使用剪裁蒙版,片段着色器或alpha混合。我見過這個帖子:How to create Stencil buffer with texture (Image) in OpenGL-ES 2.0這看起來與我需要的類似,但我不完全明白如何處理discard關鍵字。它適用於我的情況嗎?

回答

0

讓我們假設你有一個方格紋理的黑色和白色方塊。首先,您需要設置模板測試以繪製蒙版:

glEnable(GL_STENCIL_TEST); 
glDisable(GL_DEPTH_TEST); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glDepthMask(GL_FALSE); 

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

接下來繪製方格紋理。這裏的關鍵步驟(放棄進來的地方)是,你設置你的片段着色器只繪製棋盤是黑色的片段(或者如果你願意,可以將其翻轉爲白色)。丟棄關鍵字會跳過渲染與您的條件不匹配的任何像素。

//in the fragment shader 
if(sampleColor.r > 0.5) { discard; } 

此渲染步驟後​​,必須用棋盤圖像,其中所述緩衝器的一半具有爲0的模板值,而另一半模板緩衝區具有1

模版值。然後,通常使與模板測試啓用通過當模板緩存是== 1

glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
glStencilFunc(GL_EQUAL, 1, -1); 
+0

確定,但如果我想我的質地是一個矩形,在屏幕前沒有它受着做不同的變換模型視圖矩陣(旋轉翻譯)。我是否需要第二個視口始終保持最佳狀態,然後根據該視口影響模版,以便同時影響這兩個視口?如果這是有道理的... – PPR 2012-07-06 20:39:27

+0

我不認爲你需要對視口做任何事情。如果你不想讓你的紋理受到當前MVP矩陣的影響,那麼就不要將它乘以頂點着色器中的矩陣。 @PPR – Tim 2012-07-06 20:51:55