首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >碎片着色器中的丢弃是否会阻止对模板缓冲区的修改?

碎片着色器中的丢弃是否会阻止对模板缓冲区的修改?
EN

Stack Overflow用户
提问于 2020-08-13 22:46:47
回答 1查看 926关注 0票数 1

我想让discard在我的片段着色器中,防止该片段写入模板缓冲区;我有一个在我的游戏中视觉效果的想法,如果我可以依赖于discard的行为,它可能是可实现的。

我的片段着色器没有什么特别之处;它只是对纹理进行了采样,如果alpha接近于0,它就会discard,否则它会写。

代码语言:javascript
复制
void main()
{
    vec4 texColor = texture(tex, texCoord);
    if(texColor.a < 0.5f)
    {
        discard;
    }
    FragColor = texColor;
}

但是,听起来像是 I不能依赖discard阻止将模具缓冲区写入:

如果模板测试是活动的,那么丢弃的碎片仍然会影响模具缓冲区。即使在模具或深度测试失败时,模具测试也可以修改模具缓冲区。由于模具测试发生在深度测试之前,深度测试失败不能阻止模具测试更新模具缓冲区。

在渲染时,我确实需要激活模具测试。我可以不依赖discard阻止写到模具缓冲区吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-14 05:58:47

根据OpenGL操作顺序的一般规则,模板测试是在片段着色器执行后进行的。因此,执行discard语句的片段着色器将防止写入帧缓冲区图像。只有一个例外。

唯一的例外是FS的明确请求可以更改操作顺序。如果没有给出这样的请求,那么事情就必须按照原来的顺序进行(这就是为什么使用discard 关闭早期片段测试作为优化)。

所讨论的段落是关于称为“模具测试”的操作的一部分如何包括可能更新到模具缓冲区。也就是说,模具测试既可以丢弃片段,也可以根据模板缓冲区的丢弃方式更改模具缓冲区的值。这与深度测试不同,深度测试如果失败,就永远不要更新深度缓冲区的值。

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

https://stackoverflow.com/questions/63404195

复制
相关文章

相似问题

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