我遇到了以下(我认为)精度错误。
我的灵感来源是: http://fabiensanglard.net/lightScattering/
在PC上一切正常,但在Android上它显示了那些奇怪的方块。
程序掩盖的精灵我遇到了同样的问题。当圆的半径变得太大时,我有相同的错误,所以我将遮罩从着色器半径均匀更改为纹理遮罩均匀,所以我猜有一个精度问题。
这家伙有同样的问题,但不幸的是我找不到答案。
http://community.arm.com/thread/4024
适用于OpenGL ES的代码如下:
#version 100
precision mediump float;
uniform sampler2D tex_diff;
uniform vec2 light_on_screen;
varying vec2 texture_coord;
const int NUM_SAMPLES = 128;
void main()
{
const float exposure = 0.0225;
const float decay = 0.95;
const float density = 0.95;
const float weight = 3.75;
// Inner used valuesa
vec2 deltaTextCoord = vec2(texture_coord.st - light_on_screen.xy);
vec2 textCoo = texture_coord.st;
deltaTextCoord *= 1.0 / float(NUM_SAMPLES) * density;
float illuminationDecay = 1.0;
vec4 c = vec4(0, 0, 0, 0);
for(int i=0; i < NUM_SAMPLES ; i++)
{
textCoo -= deltaTextCoord;
textCoo.s = clamp(textCoo.s, 0.0, 1.0);
textCoo.t = clamp(textCoo.t, 0.0, 1.0);
vec4 sample = texture2D(tex_diff, textCoo);
sample *= illuminationDecay * weight;
c += sample;
illuminationDecay *= decay;
}
c *= exposure;
c.r = clamp(c.r, 0.0, 1.0);
c.g = clamp(c.g, 0.0, 1.0);
c.b = clamp(c.b, 0.0, 1.0);
c.a = clamp(c.a, 0.0, 1.0);
gl_FragColor = c;
}
显示整个引擎是无用的,因为它是巨大的。所有着色器输入都是正确的,坐标是正确的,唯一的问题是内部着色器计算。
是否有人遇到此问题或对任何变通办法有任何想法?
扫描整个网络寻找解决方案,我似乎找不到一个。任何人都可以指出我正确的方向?或者有人在不同的上下文或不同的着色器中遇到过这种类型的错误?也许我也可以在这里应用相同的解决方法。
答案 0 :(得分:1)
常见的差异之一是在移动设备上使用mediump(通常是fp16)与桌面设备(通常不会实现fp16,只是提升到fp32)。
如果你使用highp它看起来更好吗?
答案 1 :(得分:0)
更新了一个小修正:
是的,问题是:
&#39; textCoo - = deltaTextCoord&#39;;
由于fp精度,误差累积增长到2.7%。计算每个循环而不是减去增量可以解决问题的很大一部分。
至于优化,我使用了一些技巧,得到了合理的40fps。
看到这篇文章,我在这里问了同样的问题: http://community.arm.com/message/29658?et=watches.email.thread#29658
对于使用的优化,请参阅此帖子: http://www.gamedev.net/topic/670346-opengl-es-god-ray-precision-error/