两个归一化向量的 GLSL 点在安卓上返回值 > 1.0
glsl dot of two normalized vectors returning value > 1.0 on android
我在安卓系统上使用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浮点的理解还需要一些工作…)
相关文章:
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 使用 std::p air 进行返回值优化
- C++输出参数与返回值