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

标签 opengl fragment-shader stencil-buffer

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

//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 着色器执行此操作的替代方法?告诉我怎么做。

最佳答案

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

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

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

关于opengl - 如何在片段着色器中进行自定义模板测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666807/

相关文章:

android - 在同一着色器中混合具有不同坐标和大小的两个纹理

opengl - 如何获取片段的当前颜色?

c++ - 影响片段着色器内部的深度或模板缓冲区?

opengl - 凹多边形绘制

delphi - 全局轮换

c++ - 在 OpenGL 中绘制立方体。迭代更短的代码,但不起作用

c++ - 为什么我在屏幕上显示了一半的三角形?

c++ - OpenGL:清除模板缓冲区,某些位除外?

安卓 OpenGL ES 1.1 : Read from Stencil Buffer

c - 在OpenGL中实现缠绕规则