我想让discard在我的片段着色器中,防止该片段写入模板缓冲区;我有一个在我的游戏中视觉效果的想法,如果我可以依赖于discard的行为,它可能是可实现的。
我的片段着色器没有什么特别之处;它只是对纹理进行了采样,如果alpha接近于0,它就会discard,否则它会写。
void main()
{
vec4 texColor = texture(tex, texCoord);
if(texColor.a < 0.5f)
{
discard;
}
FragColor = texColor;
}但是,听起来像是 I不能依赖discard阻止将模具缓冲区写入:
如果模板测试是活动的,那么丢弃的碎片仍然会影响模具缓冲区。即使在模具或深度测试失败时,模具测试也可以修改模具缓冲区。由于模具测试发生在深度测试之前,深度测试失败不能阻止模具测试更新模具缓冲区。
在渲染时,我确实需要激活模具测试。我可以不依赖discard阻止写到模具缓冲区吗?
发布于 2020-08-14 05:58:47
根据OpenGL操作顺序的一般规则,模板测试是在片段着色器执行后进行的。因此,执行discard语句的片段着色器将防止写入帧缓冲区图像。只有一个例外。
唯一的例外是FS的明确请求可以更改操作顺序。如果没有给出这样的请求,那么事情就必须按照原来的顺序进行(这就是为什么使用discard 关闭早期片段测试作为优化)。
所讨论的段落是关于称为“模具测试”的操作的一部分如何包括可能更新到模具缓冲区。也就是说,模具测试既可以丢弃片段,也可以根据模板缓冲区的丢弃方式更改模具缓冲区的值。这与深度测试不同,深度测试如果失败,就永远不要更新深度缓冲区的值。
https://stackoverflow.com/questions/63404195
复制相似问题