opengl - 关于在 GLSL 中避免 IF

标签 opengl glsl

有人知道如何避免使用这些 IF 语句吗?

float v = 9999.0;
if (a.x > 0.0 && a.x < v) { v = a.x; }
if (a.y > 0.0 && a.y < v) { v = a.y; }
if (a.z > 0.0 && a.z < v) { v = a.z; }

最初我使用了以下几行,但后来我意识到我只想要最小当且仅当它不等于零。

float v = min(a.x, min(a.y, a.z));

我还假设 a.xyz 始终大于或等于零,至少是大于零的分量之一。

最佳答案

你可以使用这样的结构

vec3 b=a+10000.0*step(0.0, -a);
float v=min(b.x, min(b.y, b.z));

它还假设(正如您的代码所做的那样)您的最小元素是 < 10000。请注意,选择了 step(0,0, -a) 以支持 (1.0- step(0.0, a)) 因为 step 被定义为仅当值低于边缘(在本例中为 0.0)时才返回 0.0,如果相等则不返回。在实践中,使用较小的 epsilon 值可能仍然是个好主意。

关于opengl - 关于在 GLSL 中避免 IF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19432264/

相关文章:

GLSL channel 选择

algorithm - 如何表达复数的四聚函数

OpenGL 无绑定(bind)纹理 : Bind to uniform sampler2D array

c++ - 将阴影添加到视差遮挡贴图

opengl - GLSL 统一布局绑定(bind)和纹理

c++ - Phong Shading 在 GLSL 中是如何实现的?

c++ - 将字节数组(从内存)加载到 LibPNG C++

c++ - 无法在 QGLWidget 中设置所需的 OpenGL 版本

Opengl 深度缓冲区和剔除

iphone - OpenGL ES 2.0 衍生纹理