两个归一化向量的 GLSL 点在安卓上返回值 > 1.0

glsl dot of two normalized vectors returning value > 1.0 on android

本文关键字:返回值 gt GLSL 两个 向量      更新时间:2023-10-16

我在安卓系统上使用SDL 2.0和OpenGL 2.1(Moto G上的5.1棒棒糖)。

我基本上有这样的代码:

vec3 norm = normalize(var_normal);
vec3 sun = normalize(sun_position-var_position);
float diff = max(dot(norm,sun),0.);

在我的碎片着色器中。

diff应始终是一个介于0之间的值。和1.,对吧?

不幸的是,由于调试glsl细节的困难,我不确定diff得到的确切值,但它似乎被夸大了。如果我将gl_FragColor = vec4(diff,diff,diff,1.);设置为调试,那么90%的像素都是纯白色的——只有法线不垂直于相机的像素不是白色的。

有趣的是,当我在我的电脑(OSX El Capitan)上运行它时,它会像预期的那样工作。

所以,我不是用0来最大化这个点,而是把它箝位到0。然后一切都开始看起来更加合理,但扩散范围明显较小。

关于这些差异,有什么想法吗?

Shucks。应该知道的。

我的问题是浮点精度。我的"sun_position"变量设置得太远了。我只是拉近了距离,一切都很好。

我本以为精度上的误差会导致不太精确的方向(例如,sun_pos-frag_pos向量会在这样的距离上"突然"达到如此低的精度所给出的各种容差),但归一化应该将该向量降低到单位大小吗?正确的所以我希望任何精度误差都会导致"错误"的方向,而不是破坏正常的方向?(显然我错了。我想我对IEEE浮点的理解还需要一些工作…)