WebGL可以忽略for循环吗?

时间:2014-02-02 21:33:12

标签: opengl-es-2.0 webgl

我正在台式机和平板电脑上测试一个WebGL片段着色器,我注意到在平板电脑上(Chrome和FF),着色器看起来就像我在一个for中设置迭代次数一样循环到1.(它在桌面浏览器上运行良好。)

平板电脑的性能几乎无法使用,因此我计划最终使用着色器为低端​​设备预渲染静态纹理。但是,如果它不执行循环,我必须手动展开它以使其执行吗?

下面的代码,对不起,这是一项正在进行中的工作。它结合了我在glsl.heroku.com上找到的几个修改过的着色器脚本。我没有在任何桌面浏览器上看到任何错误。

我不希望任何人调试或改进我的代码,我更感兴趣的是找出浏览器是否可以短路for循环,什么会触发它以及可能有什么变通方法。

precision mediump float;

#define CLOUD_ITERS 25
#define WISP_ITERS 5

uniform float uTime;
uniform vec2 uPos;
uniform vec3 uAddColor;
uniform sampler2D uSampler;     // starfield
uniform sampler2D uSampler2;    // very dense starfield

varying vec2 vTexcoord;

void main()
{
    //
    //  Nebula clouds
    //
    vec2 p = vTexcoord * 0.85;
    p += uPos * 0.6;
    float t = uTime / 400.0;
    for( int i = 1; i < CLOUD_ITERS; i++ )
    {
        float f = float(i);
        vec2 p2 = p;
        p2.x += 0.6 / f * sin(f * p.y + t + 0.3 * f) + 1.0;
        p2.y += 0.6 / f * cos(f * p.x + t + 0.3 * (f + 10.0)) - 1.4;
        p = p2;
    }

    vec3 col = max( vec3(
        0.11 * sin(5.0 * p.x),
        0.02 * sin(5.0 * p.y),
        sin(p.x + p.y) * 0.18
    ), 0.0);

    //
    //  Wisps
    //
    float c = 1.0;
    float inten = 0.05;
    p.x = vTexcoord.x * 3.0 - 15.0 + uPos.x;
    p.y = vTexcoord.y * 3.0 - 15.0 + uPos.y;
    vec2 p2 = p;

    for( int i = 0; i < WISP_ITERS; i++ )
    {
        t = uTime * 0.0025 * (1.0 - (3.0 / float(i+1)));
        p2 = p + vec2(cos(t - p2.x) + sin(t + p2.y), sin(t - p2.y) + cos(t + p2.x));
        c += 1.0 / length(vec2(p.x / (2.0*sin(p2.x+t)/inten), p.y / (cos(p2.y+t)/inten)));
    }
    c /= 8.0;
    c = 1.3 - sqrt(pow(c, 3.0 * 30.0 * 0.025));
    c = pow(c, 12.0);
    vec3 col2 = clamp(vec3(c*0.05, c*0.035, c*0.07), 0.0, 1.0);

    vec4 star2Col = texture2D(uSampler2, vec2(vTexcoord.s * 2.5 + uPos.x * 0.75, vTexcoord.t * 2.5 + uPos.y * 0.75));
    col2 += col2 * star2Col.rgb;

    //
    //  Starfield layers (from texture)
    //
    //vec4 starCol1 = texture2D(uSampler, vec2(vTexcoord.s * 2.5 + uPos.x * 1.0, vTexcoord.t * 2.5 + uPos.y * 1.0));
    vec4 starCol2 = texture2D(uSampler, vec2(vTexcoord.s * 2.0 + uPos.x * 1.7, vTexcoord.t * 2.0 + uPos.y * 1.7));
    vec4 starCol3 = texture2D(uSampler, vec2(vTexcoord.s * 1.25 + uPos.x * 2.5, vTexcoord.t * 1.25 + uPos.y * 2.5));

    gl_FragColor = vec4(
        uAddColor +
        col +
        col2 +
        //starCol1.rgb * 0.3 +
        starCol2.rgb * 0.4 +
        starCol3.rgb * 0.5
        , 1.0
    );
}

0 个答案:

没有答案