首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模板测试时读取深度值(相同的纹理)

问在模板测试时读取深度值(相同的纹理)
EN

Stack Overflow用户
提问于 2016-04-22 00:45:42
回答 1查看 879关注 0票数 0

我知道,从同一个纹理/位置读/写是一个非常糟糕的主意,因为这会导致未定义的行为。但在我的例子中,如果深度测试被禁用,并且我在着色器中读取深度值,那么在同一纹理中同时读取深度值是否可以同时进行模具测试?

在我看来,不应该有任何问题,因为我没有读取模板缓冲区值的着色器。或者,当纹理被绑定在着色器中读取并且OpenGL使用它进行模具测试时,是否会出现与硬件相关的问题?

此纹理中填充深度/模板值。我不想避免一些沉重的BRDF照明(方向光)计算的特定像素(天空)。

示例代码:

代码语言:javascript
复制
//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();
EN

回答 1

Stack Overflow用户

发布于 2016-04-22 04:49:07

但在我的例子中,如果深度测试被禁用,并且我在着色器中读取深度值,那么在同一纹理中同时读取深度值是否可以同时进行模具测试?

不是的。是否定义一个操作是基于附加到FBO和读取的图像。而不是这些图像的成分。不,写掩蔽并不能使你从未定义的行为中解脱出来。

因此,除非您的模具纹理是独立于您的深度纹理,这是行不通的。并祝您好运的硬件,将允许您分离深度/模板图像。

即使使用GL4.5/NV/ARB_织构_ Even,答案仍然是否定的。该功能使上述规则有某些例外,但仅适用于碎片着色器输出的操作。模板测试操作不是片段着色器输出,所以它们不适用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36782796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档