GLSL:确定向量是否不为零

GLSL:确定向量是否不为零,glsl,Glsl,我使用顶点和片段着色器对来绘制分子可视化的圆柱体冒名顶替。着色器在屏幕上渲染500.000个圆柱体(键)。显然,着色器优化是一个问题 对于每个渲染的圆柱体,我必须确定某些vec3(比如u)是否不是零向量。我可以这样做: dot(u,u) != 0.0 (u.x != 0.0) || (u.y != 0.0) || (u.z != 0.0) any(notEqual(u, vec3(0.0, 0.0, 0.0))) 最快的方法是什么?上述问题的替代解决方案非常受欢迎 致以最良好的祝愿 Mad

我使用顶点和片段着色器对来绘制分子可视化的圆柱体冒名顶替。着色器在屏幕上渲染500.000个圆柱体(键)。显然,着色器优化是一个问题

对于每个渲染的圆柱体,我必须确定某些vec3(比如u)是否不是零向量。我可以这样做:

dot(u,u) != 0.0

(u.x != 0.0) || (u.y != 0.0) || (u.z != 0.0)

any(notEqual(u, vec3(0.0, 0.0, 0.0)))
最快的方法是什么?上述问题的替代解决方案非常受欢迎

致以最良好的祝愿


Mads

因为精度确实是浮点计算的一个问题,所以应该考虑到它,真的

#define PRECISION 0.000001

float val = ...;
// returns 1.0 if it's in the range, 0.0 otherwise
float is_not_too_close_to_zero = step(-PRECISION, val) * (1.0 - step(PRECISION, val));

然后,可以将此技术结合起来生成更复杂的检查。

您是否只关心向量不是所有组件的精确0.0的情况?由于这是浮点运算,因此在很多情况下,如果使用笔和纸进行计算,结果将精确为0.0,但在着色器中进行计算时,结果可能为+/-0.0000…1。实际上,您唯一希望根据特定值测试浮点数的时候是在某个地方显式将其设置为该值,或者知道数学不会出现精度错误。当我显示圆柱体时,我需要将其旋转到位,即沿其v轴对齐。为此,我计算u=cross(v,z),其中v是圆柱轴,z是z轴。如果你0,它应该被规格化,即u=规格化(u)。如果圆柱体(键合)沿z轴对齐,则很容易出现u=0的情况。所以我需要检查一下你!=0,并希望尽可能高效地执行此操作。