2016-04-22 29 views
0

我知道從同一紋理/位置讀取/寫入是一個非常糟糕的想法,因爲這會導致未定義的行爲。 但在我的情況下,如果禁用了深度測試,並且我在着色器中讀取了深度值,那麼在讀取相同紋理中的深度值的同時進行模板測試可以嗎?模板測試(紋理相同)時讀取深度值

在我看來,應該不會有任何問題,因爲我沒有讀取着色器中的模板緩衝區值。或者,當紋理被着色器讀取並且OpenGL使用它進行模板測試時,是否會遇到與硬件相關的問題?

該紋理填充有深度/模板值。我不想避免在特定像素(天空)上進行一些沉重的BRDF照明(定向光)計算。

示例代碼:

//Contains the depth/stencil texture(deferredDepthStencilTextureID). 
//Two FBO's are sharing the same depth/stencil texture. 
lightAccumulationFBO->bind(); 

glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_EQUAL, 1, 0xFF); 
//Disable writing to the stencil buffer, i.e. all the bits is write-protected. 
glStencilMask(0x00); 

glDisable(GL_DEPTH_TEST); 
glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE); //Additive blending. Light accumulation. 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, deferredDepthStencilTextureID); //GL_DEPTH24_STENCIL8 
//Bind other textures here... 

shader.bind(); 
//Uniforms here... 
postProcessQuad->renderQuad(); 
shader.unbind(); 

//Unbind all the textures here. 
... 

glDisable(GL_BLEND); 
glEnable(GL_DEPTH_TEST); 
glDisable(GL_STENCIL_TEST); 

lightAccumulationFBO->unbind(); 
+0

您是否僅在此渲染過程中進行模板測試,還是使用修改模板值的模板操作? –

+0

我已經用示例代碼更新了我的帖子。我沒有在此渲染過程中包含模板操作。我還設置了模板掩模,如下所示:glStencilMask(0x00); – karl88

回答

0

但在我的情況下,如果深度測試被禁用,我在着色器讀取的深度值,它是確定做模板測試在同一時間閱讀相同紋理內的深度值?

否操作是否定義是基於附加到FBO的圖像並讀取。不是所述圖像的組件。不,寫掩碼不會讓你免於未定義的行爲。

所以,除非你的模板紋理與你的深度紋理分開,否則這是行不通的。祝你好運找到硬件,可以讓你分開深度/模板圖像。

即使使用GL 4.5/NV/ARB_texture_barrier,答案仍然是否定的。該功能會對上述規則做出某些例外,但僅限於由於片段着色器輸出而產生的操作。模板測試操作不是片段着色器輸出,所以它們不適用。

+0

好的,謝謝你的信息。那麼,我有什麼選擇?渲染四邊形並複製深度信息。到另一個fbo /紋理? Blitting fbos?哪種方法最適合性能? – karl88