到目前为止,我的游戏在我尝试过的任何设备(主要是手机)上运行顺畅,总是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 的所有内容都未使用,所以不要这样做。显然,这会影响性能但是,如果它没有优化,那么我不知所措。任何想法?
答案 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);
}