6

此处描述了HLSLclip()功能。

我打算在 OpenGL 中将其用于 alpha 截止。GLSL 中的等价物是否只是

if (gl_FragColor.a < cutoff)
{
    discard;
}

还是有一些更有效的等价物?

4

1 回答 1

14

OpenGL 没有这样的功能。它不需要一个。

还是有一些更有效的等价物?

该问题假定此条件语句的效率低于调用 HLSL 的clip函数。它很有可能有效(尽管如此,它还是一个完全的微优化)。clip检查该值是否小于 0,如果是,则丢弃该片段。但是您不是针对零进行测试;您正在针对 进行测试cutoff,这可能不是 0。因此,您必须clip像这样调用(使用 GLSL 样式):clip(gl_FragColor.a - cutoff)

如果硬件不直接支持 clip ,那么您的调用相当于if(gl_FragColor.a - cutoff < 0) discard;. 这是一个数学运算一个条件测试。这比条件测试要慢。如果不是……驱动程序几乎肯定会重新排列您的代码以以这种方式进行条件测试。

条件会比clip硬件有特定支持的唯一方法要慢,clip 并且驱动程序太愚蠢而无法转换if(gl_FragColor.a < cutoff) discard;clip(gl_FragColor.a - cutoff). 如果驱动程序那么愚蠢,如果它缺乏基本的针孔优化,那么您将面临比这更大的性能问题要处理。

简而言之:不用担心。

于 2012-10-06T20:29:36.897 回答