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

问题描述

我想在片段着色器中使用discard来阻止该片段写入模板缓冲区;我对游戏中的视觉效果有一个主意,如果我可以依靠discard的行为来实现,那就可以实现。

我的片段着色器没有做任何花哨的事情;它只是对纹理进行采样,如果alpha接近0,则discard否则将写入。

void main()
{
    vec4 texColor = texture(tex,texCoord);
    if(texColor.a < 0.5f)
    {
        discard;
    }
    FragColor = texColor;
}

但是,it sounds like我不能依靠discard来防止模板缓冲区被写入:

如果模板测试处于活动状态,则丢弃的片段仍会影响模板缓冲区。模板测试可以修改模板缓冲区,即使模板或深度测试失败也是如此。而且由于模板测试是在深度测试之前进行的,因此深度测试失败无法阻止模板测试更新模板缓冲区。

我确实需要在渲染时激活模板测试。我可以不依靠discard来防止写入模板缓冲区吗?

解决方法

按照OpenGL操作顺序的正常规则,模版测试在执行片段着色器之后进行。这样,执行discard语句的片段着色器将防止写入帧缓冲区图像。除了一个例外。

例外情况是操作顺序可以由explicit request of the FS更改。如果没有给出这样的请求,那么事情必须按照原始顺序定义进行(这就是为什么使用discard turns off early fragment tests as an optimization的原因。)

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...