0

我在不同设备上的片段着色器遇到了一些问题。在某些设备上,着色器工作正常,但在其他设备上,算法会产生奇怪的结果。我检查了 Java 中的算法,以确保算法本身不包含错误。

算法失败的部分如下。当我这样编写计算时,它适用于所有设备:

float a = sqrt(dot(MD,MD));
float factor = (dot(MD,b)/a)/a;

但如果我使用

float factor = dot(MD,b)/dot(MD,MD);

我相信这是相同的计算,因此应该产生相同的结果,但该算法在某些设备上失败。可能发生故障的其他部分更复杂,但也许如果我能理解为什么会失败,我也可以解决其他部分。

任何帮助将不胜感激。

顺便说一句,我正在使用具有精度 mediump float 的 OpenGL ES 2.0 并且 dot(MD,MD) 始终大于零

4

1 回答 1

1

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

至于您的示例,当 dot(MD,MD) 接近 0 sqrt 时,将其移开,从而稳定该数字的进一步操作。在该部门,这一点尤其重要。

于 2013-07-04T15:13:32.000 回答