返回值的两个规范化向量的glsl点>;android上的1.0

返回值的两个规范化向量的glsl点>;android上的1.0,android,c++,opengl-es,glsl,sdl,Android,C++,Opengl Es,Glsl,Sdl,我正在使用SDL2.0和android上的OpenGL2.1(MotoG上的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得到的确切值,但它似乎被彻

我正在使用SDL2.0和android上的OpenGL2.1(MotoG上的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。和1。。然后,一切看起来都更合理,但漫反射范围明显较小


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

废话。我早该知道的

我的问题是浮点精度。我的“sun_position”变量设置得非常远。我只是把它靠近了一点,一切都很好


我本以为精度误差会导致方向不太精确(如中所示,sun_pos-frag_pos向量将“捕捉”到如此低的精度在如此远的距离上给出的各种容差),但normalize应该将该向量降低到单位大小?正确的?所以我认为任何精度误差都会导致“错误”的方向,而不是一个爆炸的正常方向?(显然我错了。我想我对IEEE浮点运算的理解还需要一些工作…

是的,
vec3
远不能满足我们太阳系使用实际单位时所需的精度要求。。。移位有助于观察,但它必须在插值器之外进行,有时甚至在GLSL本身之外。最好是为向量变换使用单独的矩阵,这样位置不会降低变换的精度。但是是的,
diff
应该在
范围内,所以要么是驱动程序错误,要么是其他地方的代码有问题。(你绝对确定你在射程之外吗?我想这对你来说可能很有趣you@Spektre等等-我很困惑。首先,我不是在做太阳系模型。只是用太阳位置作为“室外灯光位置”。不是用真实的单位,只是用了“9999999”之类的东西。不管怎么说,我假设正在发生的是“正常化”取sqrt(x^2+y^2+z^2)并将x、y和z除以结果。如果fp精度得到的sqrt的答案比实际值小,则归一化除法将得到vec>1。非归一化vec的点可以大于1。有趣的副作用-我本可以通过归一化(normalize())来“解决”(当然不准确)。:)很抱歉,当我看到
太阳位置和精度问题时,我认为您对太阳系渲染感兴趣:)。我所说的真实单位是指我渲染的距离/大小范围很大,从
0.1m
1000.0AU=149597870000m
,这带来了大量问题。。。如果你得到的只是一个简单的场景,那么你可以忽略所有这些。。。