0

由于建议不要在着色器中使用条件,这对于 boolean uniform 来说更好:

A. 为布尔统一的不同值创建不同的着色器?

B. 创建一个着色器并if-else在如下代码中使用:

uniform bool uValue;
if (uValue) {
// code
} else {
// code
}

我在某处读到,对于统一的布尔值,驱动程序将编译多个着色器,这样我们就不必费心创建多个着色器。但我无法验证这一点。

谢谢!

4

2 回答 2

2

哪种方法更高效取决于许多其他事情:

  • 你开启了多少条件?
  • 你每帧切换多少次?
  • 条件的两侧发生了多少计算?
  • 在您的情况下还有哪些其他性能限制?内存使用情况?能量消耗?客户端到 GPU 的带宽?

尝试这两个选项并使用 Instruments 进行测试,看看哪个在您的情况下表现更好。

于 2013-09-18T00:13:38.067 回答
0

我们都知道驱动程序在 GPU 编程中变化非常快。

如果您的情况相当均衡,那么可能没有明确的正确或错误答案。这将取决于硬件、驱动程序的版本以及卡本身用于创建并行批次的未来可能的机制。

如果您的条件更偏向一边,那么在一个着色器中使用 if 条件或使用两个着色器并进行切换可能会带来真正的好处。在处理真实数据时测试显卡的负载是真正回答这个问题的唯一方法。

如果这被确定为您的瓶颈点并且值得花时间投资,那么也许将两者都包括在内,并在运行时进行选择。但是请记住,如果它不能使您的着色器更快,那么优化代码是没有意义的。如果您的代码提供了所有请求的视觉功能并且您仍然受处理器限制,那么您已经完成了您的工作。

同样优化 if 语句,当你被 fetch 绑定时,没有任何意义。所以保持你所有的优化,直到你达到尽可能多的视觉特征,然后优化,这可能会给你一个更多的特征,然后再次优化。

于 2013-09-21T05:50:31.043 回答