2012-07-08 118 views
5

我嘗試使用「模板緩衝區」來顯示紋理中的一部分渲染,但是我的渲染沒有任何遮罩效果。在iOS中使用模板緩衝區

這是一個2D的iOS項目,OpenGL ES 2.0的 這是我的代碼的相關部分:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
glEnable(GL_STENCIL_TEST); 


// mask rendering 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, _maskTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 


// scene rendering 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glBindTexture(GL_TEXTURE_2D, _viewTexture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

任何幫助將不勝感激!

(像往常一樣爲法國開發商,對不起我的英語!)

精度:「_maskTexture」是一個黑色&白畫面。


解決方法:


我finnaly解決我的問題與rotoglub的跡象。 謝謝你們兩位。

1 /模板緩衝區尚未正確創建。 應該初始化是這樣的:

glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, 
          GL_DEPTH24_STENCIL8_OES, 
          backingWidth, 
          backingHeight); 

這是主要的原因,我的渲染並沒有受到我的面具。

2 /爲了能夠使用紋理作爲蒙版,我用alpha通道替換了黑色,並在渲染中啓用了混合。

我的最終渲染代碼如下所示:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, vertices); 
glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 

glClearStencil(0); 
glClearColor (0.0,0.0,0.0,1); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 


// mask rendering 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
glEnable(GL_STENCIL_TEST); 
glEnable(GL_ALPHA_TEST); 
glBlendFunc(GL_ONE, GL_ONE); 
glAlphaFunc(GL_NOTEQUAL, 0.0); 
glStencilFunc(GL_ALWAYS, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 

glBindTexture(GL_TEXTURE_2D, _mask); 
glDrawArrays(GL_TRIANGLE_STRIP, 4, 4); 

// scene rendering 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glStencilFunc(GL_EQUAL, 1, 1); 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 

glDisable(GL_STENCIL_TEST); 
glDisable(GL_ALPHA_TEST); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
+1

只是說明你的問題做了如*不工作*是不是真的有幫助。但我想你的問題是在這個其他問題解決的問題:http://stackoverflow.com/questions/7571075/how-to-create-stencil-buffer-with-texture-image-in-opengl-es-2- 0 – rotoglup 2012-07-08 15:52:50

+0

謝謝你的評論。 通過「不工作」,我的意思是「_viewTexture」顯示沒有任何「_maskTexture」的蒙版效果。 我會盡力在未來更具體。 關於你提到的帖子,我已經閱讀過,但如果我沒有錯,他用着色器解決了他的問題,並放棄了模板緩衝區。 – EricD 2012-07-08 16:18:02

+1

在閱讀您的解決方案後,我認爲您仍然有問題(可能暫時隱藏):您的第二次渲染通道禁用了模板測試,因此您所觀察的遮罩不能被此測試激發。此外,混合不應該用於模板測試,只適用於alpha測試。我認爲你觀察了你想要的掩蔽,但可能是因爲另一個原因,即模板印刷。 – rotoglup 2012-07-08 21:46:05

回答

1

簡單地說,問題是,你只是繪製紋理現場沒有做一個什麼樣的紋理中的任何測試。模板緩存不關心紋理的顏色,它只是檢查:

Did you draw a fragment ? (Update stencil buffer) : (Don't update stencil buffer);

您繪製的片段爲你的紋理的每個像素,所以在任何質地面膜效果是沒用的。

如果要使用紋理進行遮罩,則需要放棄您不希望在模板緩衝區中更新的任何片段。

這要麼discard關鍵字着色器,或在glAlphaTest/glAlphaFunc 1.1 OpenGLES