如何在片段着色器中进行自定义模板测试

Posted

技术标签:

【中文标题】如何在片段着色器中进行自定义模板测试【英文标题】:how to do customized stencil test in fragment shader 【发布时间】:2013-05-21 09:39:39 【问题描述】:

在我的项目中,我使用“丢弃”调用来执行自定义模板测试,该测试尝试仅在模板纹理定义的指定区域上绘制东西。这是片段着色器的代码:

//get the stencil value from a texture
float value=texture2D( stencilTexture, gl_FragCoord.xy/1024.0).x;
//check if value equals the desired value, if not draw nothing
if(abs(value-desiredValue)>0.1)

    discard;

此代码有效,但由于“丢弃”调用而出现性能问题。有没有其他方法可以通过 GPU 着色器做到这一点?告诉我怎么做。

【问题讨论】:

为什么不能使用默认模板测试(不在着色器中)?你会得到同样的结果。 "alliterative" 我认为您的意思是“替代”。此外,还不清楚为什么需要使用 stencil 纹理来执行此操作。或者为什么你认为discard 调用是一个性能问题(或者如果它是一个性能问题,那么问题比纹理访问本身更糟糕)。 @NicolBolas:对不起我的拼写错误,在我的实验中我发现discard call是一个性能问题,link也报告了这个问题 @fen:感谢您的回复。我想在着色器中使用模板测试,因为我想在单个渲染通道中实现在不同的预定义区域上绘制我的场景。 @Sunf71:那么这并不是真正的“模板测试”;它只是根据从纹理访问中获取的值丢弃片段。模板化专门用于使用由一个渲染对象(可见或不可见)写入的值来防止写入这些渲染位置。 【参考方案1】:

如果您访问纹理,则必须承受与访问纹理相关的性能损失。同样,如果您想停止渲染片段,您必须承受与停止渲染片段相关的性能损失。

无论您如何停止该片段,这都是正确的。无论是真正的模板测试、基于着色器的discard 还是alpha 测试,所有这些都会遇到相同的一般性能问题(对于discard 导致任何重大性能问题的硬件,主要是移动硬件)。唯一的例外是深度测试,那是因为why certain hardware has problems with discard

对于discard 对性能有重大影响的平台,如果硬件可以假设深度是片段是否被渲染的最终仲裁者(因此,具有最高/最低深度总是获胜)。因此,除深度测试之外的任何剔除片段的方法都会干扰这种优化。

【讨论】:

感谢您的回复!非常合理的答案!

以上是关于如何在片段着色器中进行自定义模板测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在日期选择器中添加自定义模板。?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段2——.vue文件的模板

如何在 Shader 图形的自定义函数中使用 TEXCOORD0?

VSCode自定义代码片段1——vue主模板

VSCode自定义代码片段(vue主模板)