我知道从/向同一纹理/位置读取/写入是一个非常糟糕的主意,因为这会导致未定义的行为。 但在我的情况下,如果禁用深度测试并且我在着色器中读取深度值,是否可以在读取同一纹理内的深度值的同时进行模板测试?
在我看来应该没有任何问题,因为我没有在着色器中读取模板缓冲区值。或者,当纹理绑定在着色器中读取并且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 :(得分:1)
但在我的情况下,如果禁用深度测试并且我在着色器中读取深度值,是否可以在读取相同纹理内的深度值的同时进行模板测试?
没有。是否定义操作是基于附加到FBO并从中读取的图像。不是所述图像的组件。不,写掩码不会使你免于未定义的行为。
因此,除非你的模板纹理与你的深度纹理分开,否则它不起作用。祝您好好找到能够分离深度/模板图像的硬件。
即使使用GL 4.5 / NV / ARB_texture_barrier,答案仍然是否定的。该功能对上述规则进行了某些例外,但仅适用于由片段着色器输出引起的操作。模板测试操作不是片段着色器输出,因此它们不适用。