我的地形使用着色器,它本身使用四种不同的纹理。它在Windows和Linux机器上运行良好,但在Android上它只能在两个星系上获得~25FPS。我认为,纹理是问题,但不是,因为看起来问题在于我划分纹理坐标并使用frac来获得平铺坐标的部分。没有它,我得到60FPS。
// Material data.
//uniform vec3 uAmbient;
//uniform vec3 uDiffuse;
//uniform vec3 uLightPos[8];
//uniform vec3 uEyePos;
//uniform vec3 uFogColor;
uniform sampler2D terrain_blend;
uniform sampler2D grass;
uniform sampler2D rock;
uniform sampler2D dirt;
varying vec2 varTexCoords;
//varying vec3 varEyeNormal;
//varying float varFogWeight;
//------------------------------------------------------------------
// Name: fog
// Desc: applies calculated fog weight to fog color and mixes with
// specified color.
//------------------------------------------------------------------
//vec4 fog(vec4 color) {
// return mix(color, vec4(uFogColor, 1.0), varFogWeight);
//}
void main(void)
{
/*vec3 N = normalize(varEyeNormal);
vec3 L = normalize(uLightPos[0]);
vec3 H = normalize(L + normalize(uEyePos));
float df = max(0.0, dot(N, L));
vec3 col = uAmbient + uDiffuse * df;*/
// Take color information from textures and tile them.
vec2 tiledCoords = varTexCoords;
//vec2 tiledCoords = fract(varTexCoords / 0.05); // <========= HERE!!!!!!!!!
//vec4 colGrass = texture2D(grass, tiledCoords);
vec4 colGrass = texture2D(grass, tiledCoords);
//vec4 colDirt = texture2D(dirt, tiledCoords);
vec4 colDirt = texture2D(dirt, tiledCoords);
//vec4 colRock = texture2D(rock, tiledCoords);
vec4 colRock = texture2D(rock, tiledCoords);
// Take color information from not tiled blend map.
vec4 colBlend = texture2D(terrain_blend, varTexCoords);
// Find the inverse of all the blend weights.
float inverse = 1.0 / (colBlend.r + colBlend.g + colBlend.b);
// Scale colors by its corresponding weight.
colGrass *= colBlend.r * inverse;
colDirt *= colBlend.g * inverse;
colRock *= colBlend.b * inverse;
vec4 final = colGrass + colDirt + colRock;
//final = fog(final);
gl_FragColor = final;
}
注意:还有一些用于光计算和雾的代码,但它没有被使用。我指出了这条线,当取消注释时会导致大量延迟。我尝试使用地板并手动计算小数部分,但滞后是相同的。什么可能是错的?
编辑:现在我不明白了。
此:
vec2 tiledCoords = fract(varTexCoords * 2.0);
运行得很好。
此:
vec2 tiledCoords = fract(varTexCoords * 10.0);
在SIII上平均运行。
此:
vec2 tiledCoords = fract(varTexCoords * 20.0);
...滞后
此:
vec2 tiledCoords = fract(varTexCoords * 100.0);
5FPS仍然比我预期的好......
那是什么给出的?为什么会这样?根据我的理解,这应该没有任何区别。但确实如此。还有一个巨大的。
答案 0 :(得分:0)
我会在探查器上运行你的代码(检查Mali-400),但从它的外观来看,你正在杀死纹理缓存。对于计算的第一个像素,获取所有这4个纹理查找,但也将连续数据提取到纹理高速缓存中。对于下一个像素,您不是访问缓存中的数据,而是看起来相当远(10,20 ...等),这完全违背了这种缓存的目的。
这当然是猜测,没有适当的分析很难说。
编辑:@harism也指出了你的方向。