我在不同的设备上使用片段着色器时遇到了一些问题。 在某些设备上,着色器工作正常,但在其他设备上,算法会产生奇怪的结果。 我已经用Java检查了算法,以确保算法本身不包含错误。
算法失败的一部分如下。 当我像这样编写计算时,它适用于所有设备:
float a = sqrt(dot(MD,MD));
float factor = (dot(MD,b)/a)/a;
但如果我使用
float factor = dot(MD,b)/dot(MD,MD);
我相信这是相同的计算,因此,应该产生相同的结果,但算法在某些设备上失败。可能发生故障的其他部分更复杂,但如果我能理解为什么会失败,我也可以解决其他部分。
非常感谢任何帮助。
BTW,我正在使用OpenGL ES 2.0和精确的mediump浮点数和点(MD,MD)总是大于零
答案 0 :(得分:1)
浮点在不同设备上的工作方式不同,没有准确性保证,所以当数字太大或太小时,你应该会得到不好的结果。
对于你的例子,当点(MD,MD)接近0 sqrt时,它会远离它,从而使用这个数字稳定进一步的操作。在这个部门中,这一点尤其重要。