2

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

//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 着色器做到这一点?告诉我怎么做。

4

1 回答 1

3

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

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

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

于 2013-05-21T14:49:44.387 回答