如何解决片段着色器中的丢弃是否会阻止对模板缓冲区的修改?
我想在片段着色器中使用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的原因。)
相关段落讨论的是称为“模板测试”的操作的一部分如何包含可能对模板缓冲区进行更新。也就是说,模板测试既可以丢弃片段,又可以根据丢弃的方式更改模板缓冲区的值。这与深度测试不同,深度测试如果失败,则永远不会更新深度缓冲区的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。