我需要在GLSL中获得vec3。目前我正在做
vec3
max(max(col.r, col.g),col.b)
它工作。但我想知道是否有一个更好的方法来做到这一点与一个内置的函数调用?
ux6nzvsh1#
不幸的是,这是你在GLSL所能做的最好的事情。我已经习惯写这种东西了。但是,如果它困扰你,你总是可以编写自己的函数来做到这一点。
float max3 (vec3 v) { return max (max (v.x, v.y), v.z); }
eimct9ow2#
对于vec3,需要两个max操作,而对于vec4,不需要三个,两个就足够了:
max
vec4
vec2 maxPairs = max(v.xy, v.zw); float maxValue = max(maxPairs.x, maxPairs.y);
它甚至可以扩展到找到两个vec4和三个max:
vec4 v = max(a, b); vec2 maxPairs = max(v.xy, v.zw); float maxValue = max(maxPairs .x, maxPairs.y);
注意:我怀疑它在今天的硬件上会有什么不同,如果有,优化器可能会为你重新安排代码。我有点怀念像这样的“代码高尔夫”是我工作的一部分的时候。
2条答案
按热度按时间ux6nzvsh1#
不幸的是,这是你在GLSL所能做的最好的事情。
我已经习惯写这种东西了。但是,如果它困扰你,你总是可以编写自己的函数来做到这一点。
例如:
eimct9ow2#
对于
vec3
,需要两个max
操作,而对于vec4
,不需要三个,两个就足够了:它甚至可以扩展到找到两个
vec4
和三个max
:注意:我怀疑它在今天的硬件上会有什么不同,如果有,优化器可能会为你重新安排代码。我有点怀念像这样的“代码高尔夫”是我工作的一部分的时候。