Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在GLSL中执行此操作的更有效方法_Opengl_Optimization_Glsl - Fatal编程技术网

Opengl 在GLSL中执行此操作的更有效方法

Opengl 在GLSL中执行此操作的更有效方法,opengl,optimization,glsl,Opengl,Optimization,Glsl,x和b是向量3,a是bvec3 这似乎相当昂贵,我想知道是否有其他方法可以做到这一点。基本上,我想根据b的分数分量是否大于0.5,以及a是1还是0(真还是假),以固定的数量来偏移x分量。如果是1,我想不出比这更好的了。这一个看起来比您拥有的要简单一些: x += offset * vec3(notEqual(a, greaterThanEqual(fract(b), vec3(0.5)))); 或类似地: x += offset * vec3(notEqual(vec3(a), round(f

x和b是向量3,a是bvec3


这似乎相当昂贵,我想知道是否有其他方法可以做到这一点。基本上,我想根据b的分数分量是否大于0.5,以及a是1还是0(真还是假),以固定的数量来偏移x分量。如果是1,我想不出比这更好的了。这一个看起来比您拥有的要简单一些:

x += offset * vec3(notEqual(a, greaterThanEqual(fract(b), vec3(0.5))));
或类似地:

x += offset * vec3(notEqual(vec3(a), round(fract(b))));
如果
notEqual()
价格昂贵,则可以使用求和模2来替换xor类型的操作:

x += offset * vec3(notEqual(vec3(a), step(0.5, fract(b))));
或者以类似的精神,但避免使用
mod()
,而代价是一些更基本的操作:

x += offset * mod(vec3(a) + round(fract(b)), 2.0);

类似的想法可能还有数不清的变化和排列。正如评论中已经提到的,几乎没有办法在您所关心的硬件的良好横截面上对它们进行基准测试。

您最好的选择是看看您可以从各种不同的选项中获得什么性能。在当前的硬件上,如果一个简单的“if”语句被证明是最好的解决方案,我不会感到惊讶。@fintelia:既然条件是每个组件,那么您不需要3个if语句吗?确定不同选项的基准无疑是正确的做法,但我不会押注于使用3条if语句的解决方案。我想知道当前形式的语句是否“相当昂贵”。我也不会对
if
语句下注。不清楚这是什么上下文,但如果a或b实际上不是动态统一的表达式,引入非统一的控制流很可能会使情况变得更糟,即使是在最新一代GPU上也是如此
vec3 af = vec3(a);
vec3 brf = round(fract(b));
x += offset * (af + brf - 2.0 * af * brf);