片段着色器算法中出现意外行为

时间:2013-07-04 09:21:08

标签: opengl-es-2.0 glsles

我在不同的设备上使用片段着色器时遇到了一些问题。 在某些设备上,着色器工作正常,但在其他设备上,算法会产生奇怪的结果。 我已经用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)总是大于零

1 个答案:

答案 0 :(得分:1)

浮点在不同设备上的工作方式不同,没有准确性保证,所以当数字太大或太小时,你应该会得到不好的结果。

对于你的例子,当点(MD,MD)接近0 sqrt时,它会远离它,从而使用这个数字稳定进一步的操作。在这个部门中,这一点尤其重要。