【发布时间】:2016-10-16 02:00:09
【问题描述】:
我想知道着色器(顶点/片段/像素...)中的“if 语句”是否真的会降低着色器的性能。例如:
用这个更好吗:
vec3 output;
output = input*enable + input2*(1-enable);
而不是使用这个:
vec3 output;
if(enable == 1)
{
output = input;
}
else
{
output = input2;
}
在另一个论坛上有一个讨论(2013 年):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html 这些人在这里说,If 语句对着色器的性能非常不利。
这里他们还在谈论 if/else 语句中的内容(2012 年): https://www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)
也许硬件或着色器编译器现在更好,它们以某种方式解决了这个(可能不存在)性能问题。
编辑:
这种情况是怎么回事,这里假设 enable 是一个统一变量,它总是设置为 0:
if(enable == 1) //never happens
{
output = vec4(0,0,0,0);
}
else //always happens
{
output = calcPhong(normal, lightDir);
}
我认为我们在着色器内部有一个分支,它会减慢着色器的速度。对吗?
制作 2 个不同的着色器是否更有意义,比如一个用于 else 部分,另一个用于 if 部分?
【问题讨论】:
-
我相信 if 语句只是减少了着色器需要完成的计算。第一个示例强制着色器计算这两种情况......而 if 语句减少它。不,您的 if 语句不会消耗处理时间....因为它在编译后在最后的汇编代码中作为分支出现
-
感谢您的快速答复!我编辑了这个问题。你能回答一下编辑过的部分吗?谢谢!!!
-
我认为你不应该有 2 个着色器。我相信这开始进入过早的优化。正如@246tNt 指出的那样,如果它是统一的,编译器将处理它。但除此之外,我真的不认为你应该这么担心性能。先把它做好。然后如果看到着色器是瓶颈,然后查看算法。像这样的东西应该不会有太大伤害
-
我只问了这个问题,因为我想知道我是否可以通过这个获得更好的性能。如果您使用着色器进行迭代计算,并且在渲染图片之前必须运行 100 次,那么每毫秒都很重要
-
除非您根据经验分析并确定这是一个瓶颈,否则始终使用具有最明确意图的代码。在这种情况下,
if语句。造成这种情况的原因有两个:您最终不会得到没有证据支持它们更好的复杂代码结构,更重要的是,编译器更有可能识别您的意图并优化问题。跨度>
标签: opengl glsl shader direct3d hlsl