2013-07-04 24 views
0

我在不同的设备上使用我的片段着色器出现问题。 在某些设备上,着色器工作正常,但在其他算法上会产生好奇的结果。 我已经检查了Java中的算法,以确保算法本身不包含错误。在算法失败片段着色器算法中的意外行为

一部分如下。 当我写的计算这样它适用于所有设备:

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

,但如果我用

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

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

任何帮助将不胜感激。

顺便说一句,我使用的OpenGL ES 2.0精度mediump浮动,点(MD,MD)总是大于零

回答

1

浮点工作不同在不同的设备,也没有精确的保证,所以你应该当数字太大或太小时,预计结果不好。

作为您例如当点(MD,MD)是接近0的sqrt从因此稳定与此数目进一步操作移到它扔掉。在这个部门这是特别关键的。

+0

谢谢你,你知道关于这个主题描述为多个设备开发时,我可以做些什么来避免此类问题的任何其他方法或引用?计算一个不必要的sqrt和部门只是为了使其工作,这是不正确的。 – user1581048

+0

@ user1581048一般来说,你只是试图保持你的计算在稳定的范围内,没有共同的配方如何实现这一点。我可以建议你从关键字数值稳定性开始搜索。 – Vasaka

+0

谢谢。我有点惊讶,这样的问题是由于接近0的计算导致的,因为我认为在1到0的范围内的计算在OpenGL中并不罕见。 – user1581048