Sun*_*f71 4 opengl stencil-buffer fragment-shader
在我的项目中,我使用“丢弃”调用来执行自定义模板测试,该测试尝试仅在由模板纹理定义的指定区域上绘制内容。这是片段着色器的代码:
//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;
}
Run Code Online (Sandbox Code Playgroud)
该代码可以工作,但由于“丢弃”调用而出现性能问题。是否有其他方法可以通过 GPU 着色器来实现此目的?告诉我怎么做。
如果访问纹理,则必须承受与访问纹理相关的性能损失。同样,如果您想要停止渲染片段,则必须承受与停止渲染片段相关的性能损失。
无论您如何停止该片段,这都是正确的。无论是真正的模板测试、基于着色器的测试discard还是 alpha 测试,所有这些都会遇到相同的一般性能问题(对于discard导致任何重大性能问题的硬件,主要是移动硬件)。唯一的例外是深度测试,这是因为某些硬件存在问题discard.
对于对性能有重大影响的平台discard,如果硬件可以假设深度是是否渲染片段的最终仲裁者,则渲染算法的工作效果最佳(因此,具有最高/最低深度的片段总是获胜) 。因此,除深度测试之外的任何剔除片段的方法都会干扰这种优化。