长话短说,我最好这样做:
if (normalMappingEnabled)
{
normal = calculateBumpedNormalFromTexture();
}
else
{
normal = somethingMuchEasierToCalculate();
}
如果normalMappingEnabled是一个统一的,则calculateBumpedNormalFromTexture需要纹理查找和法线贴图所需的所有其他数学,而且WhatMuchEasierToCalculate不需要纹理查找,只需吐出插值的每顶点法线。
或者这个:
normal = calculateBumpedNormalFromTexture();
在这种情况下,如果我不需要法线贴图,则正常纹理为1x1,包含一个直指向上的纹素,产生的结果与我刚使用插值的每顶点法线相同
在大多数现代硬件上哪个更快?还有其他解决方案我没有考虑过(除了使用2个不同的着色器)吗?
答案 0 :(得分:2)
如果所有被调用的片段的条件相同,则不会发生分支差异。所以AFAIK在这种情况下,不会有性能损失。
问题是当某些线程需要执行一个分支而某些线程需要执行另一个分支时。由于不同的指令不能并行执行(在一个处理器上),两个分支将按顺序执行(一些线程将被执行,另一个部分将等待,然后另一部分将被执行,第一部分将等待)。