由于建议不要在着色器中使用条件,这对于 boolean uniform 来说更好:
A. 为布尔统一的不同值创建不同的着色器?
B. 创建一个着色器并if-else
在如下代码中使用:
uniform bool uValue;
if (uValue) {
// code
} else {
// code
}
我在某处读到,对于统一的布尔值,驱动程序将编译多个着色器,这样我们就不必费心创建多个着色器。但我无法验证这一点。
谢谢!
由于建议不要在着色器中使用条件,这对于 boolean uniform 来说更好:
A. 为布尔统一的不同值创建不同的着色器?
B. 创建一个着色器并if-else
在如下代码中使用:
uniform bool uValue;
if (uValue) {
// code
} else {
// code
}
我在某处读到,对于统一的布尔值,驱动程序将编译多个着色器,这样我们就不必费心创建多个着色器。但我无法验证这一点。
谢谢!
哪种方法更高效取决于许多其他事情:
尝试这两个选项并使用 Instruments 进行测试,看看哪个在您的情况下表现更好。
我们都知道驱动程序在 GPU 编程中变化非常快。
如果您的情况相当均衡,那么可能没有明确的正确或错误答案。这将取决于硬件、驱动程序的版本以及卡本身用于创建并行批次的未来可能的机制。
如果您的条件更偏向一边,那么在一个着色器中使用 if 条件或使用两个着色器并进行切换可能会带来真正的好处。在处理真实数据时测试显卡的负载是真正回答这个问题的唯一方法。
如果这被确定为您的瓶颈点并且值得花时间投资,那么也许将两者都包括在内,并在运行时进行选择。但是请记住,如果它不能使您的着色器更快,那么优化代码是没有意义的。如果您的代码提供了所有请求的视觉功能并且您仍然受处理器限制,那么您已经完成了您的工作。
同样优化 if 语句,当你被 fetch 绑定时,没有任何意义。所以保持你所有的优化,直到你达到尽可能多的视觉特征,然后优化,这可能会给你一个更多的特征,然后再次优化。