不确定移动GPU的复杂程度,但是我知道在过去,条件语句很昂贵,我一直在尝试用数学等价物替换条件。我已经读过现代GPU的ALU(以及FPU' s)可以执行四舍五入和免费夹紧#34;。 90%的时间我需要一个if语句,我可以从舍入函数中获得相同的结果。诀窍如下:
// with an if statement
vec4 a_fac;
vec4 b_fac;
if (a > b){
result = a * a_fac;
}
else{
result = b * b_fac;
}
相反,请执行以下数学运算:
// equivalent math
a_greater = floor(0.5 + (a - b));
result = a_greater * a_fac + (1.0 - a_greater) * b_fac;
仅当a和b的大小始终在单位范围内并且a和b之间的差值始终小于0.5(以避免地板不在{1.0,0.0}中)时,这才可行。为了防止地板出错,我可以使用以下修改:
// equivalent math
a_greater = clamp(floor(0.5 + (a - b)), 0.0, 1.0);
result = a_greater * a_fac + (1.0 - a_greater) * b_fac;
显然这意味着更多的FP计算,所以我不完全确定这种技术是否值得它#34;或如何在没有纹理填充限制的情况下组装基准。除非我创建一个也很昂贵的循环,否则最大着色器指令数可能会受到限制?