x += offset * vec3(notEqual(a, greaterThanEqual(fract(b), vec3(0.5))));
x和b是vector3,a是bvec3。
这看起来相当昂贵,我想知道是否有另一种方法可以做到这一点。基本上我想要将x分量偏移一个固定的量,这取决于b的小数分量是否大于0.5,如果a是1或0(真或假)。如果它是1并且<0.5,那么做一个偏移,如果它是0并且&gt; 0.5做一个偏移,就像xor一样,我在这里使用notEqual for xor。
答案 0 :(得分:2)
我想不出任何更好的东西。这个看起来比你有的简单:
x += offset * vec3(notEqual(vec3(a), round(fract(b))));
或类似地:
x += offset * vec3(notEqual(vec3(a), step(0.5, fract(b))));
如果notEqual()
代价昂贵,可以使用和模2替换xor类型的操作:
x += offset * mod(vec3(a) + round(fract(b)), 2.0);
或者以类似的精神,但以一些更基本的操作为代价来避免mod()
:
vec3 af = vec3(a);
vec3 brf = round(fract(b));
x += offset * (af + brf - 2.0 * af * brf);
类似的想法可能有无数更多变化和排列。正如评论中已经提到的那样,几乎没有办法在你所关注的硬件的良好横截面上对它们进行基准测试。