Android GLSL优化

时间:2014-04-19 17:26:59

标签: android opengl-es glsl

到目前为止,我的游戏在我尝试过的任何设备(主要是手机)上运行顺畅,总是50-60fps。我刚刚测试了一个Nook HD +,我得到了18fps - 几乎没有可玩性。经过一番挖掘后,我将其缩小为一个着色器:

    private final String fragmentShaderCode =
        "uniform lowp vec4 vColor;" +
        "uniform sampler2D mTexture;" +
        "uniform lowp vec4 mLightPos;" +
        "uniform lowp vec4 mCamPos;" +
        "varying lowp vec2 fragTexCoord;" +
        "varying lowp vec4 wNormal;" +
        "varying lowp vec4 wPos;" +
        "varying lowp vec2 bumpMapCoords;" +
        "void main() {" +
            "lowp vec4 bumpColor = texture2D(mTexture, bumpMapCoords);" +
            "lowp vec3 newNorm = -normalize((bumpColor.rgb - .5) * 2.0);\n" +
            "newNorm = normalize(vec3(newNorm.x, newNorm.y, newNorm.z));\n" +
            "lowp vec3 lightDir = normalize(mLightPos.xyz - wPos.xyz);" +
            "lowp vec3 viewDir = normalize(mCamPos.xyz - wPos.xyz);" +
            "lowp float d = dot(lightDir, normalize(newNorm.xyz));" + // clamp
            "lowp vec3 refl = normalize(reflect(-lightDir, newNorm.xyz));" + 
            "lowp float spec = clamp(pow(dot(refl, viewDir), 13.0), 0.0, 1.0);" +// clamp 
            "lowp float total = d + spec;" +
            //////note this line:
                ////"total = .5;" +

            "  gl_FragColor = total * vec4(vColor.r, vColor.g, vColor.b, .7);" +
        "}";

长话短说,如果我取消注释 total = .5f ,我会得到一个柔滑的57fps;没有它,18。所以我的第一个问题是,是否正在进行编译器优化,说“高于总计= .5f 的所有内容都未使用,所以不要这样做。显然,这会影响性能但是,如果它没有优化,那么我不知所措。任何想法?

1 个答案:

答案 0 :(得分:3)

好吧,如果取消注释total = .5;,编译器将删除所有未使用的变量。在这种情况下,它会丢弃您执行的所有计算,只是因为它不会影响着色器的输出。 GPU编译器可以非常有效地删除任何不影响着色器输出的内容,并且在调试时可能会有点混乱。

除此之外,你的着色器太复杂了,看起来应该是这样的:

    void main() {
        lowp vec3 N = (texture2D(mTexture, bumpMapCoords).rgb - .5f) * -2.f;
        N = normalize(N);
        lowp vec3 L = normalize(mLightPos.xyz - wPos.xyz);
        lowp vec3 E = normalize(-wPos.xyz);
        lowp vec3 R = normalize(-reflect(L, N));

        lowp float d = max(dot(L, N), 1.f));
        lowp float spec = pow(max(dot(R,E), 1.f), 13.f);

        gl_FragColor = (d + spec) * vec4(vColor.rgb, .7f);
    }