OpenGL ES God Ray Precision错误

时间:2015-07-24 14:55:23

标签: android opengl-es glsl opengl-es-2.0

我遇到了以下(我认为)精度错误。

enter image description here

enter image description here

我的灵感来源是: 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;
}

显示整个引擎是无用的,因为它是巨大的。所有着色器输入都是正确的,坐标是正确的,唯一的问题是内部着色器计算。

是否有人遇到此问题或对任何变通办法有任何想法?

扫描整个网络寻找解决方案,我似乎找不到一个。任何人都可以指出我正确的方向?或者有人在不同的上下文或不同的着色器中遇到过这种类型的错误?也许我也可以在这里应用相同的解决方法。

2 个答案:

答案 0 :(得分:1)

常见的差异之一是在移动设备上使用mediump(通常是fp16)与桌面设备(通常不会实现fp16,只是提升到fp32)。

如果你使用highp它看起来更好吗?

答案 1 :(得分:0)

更新了一个小修正:

enter image description here

enter image description here

是的,问题是:

&#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/