0

私の地形では、4 つの異なるテクスチャを使用するシェーダーを使用しています。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;
}

注: ライトの計算とフォグ用のコードがいくつかありますが、使用されていません。コメントを外すと、大きな遅延が発生する行を示しました。floor を使って小数部分を手動で計算してみましたが、ラグは同じです。何が間違っている可能性がありますか?

編集:今ここに私が理解していないものがあります。

これ:

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は思ったよりもまだ良いです...

それで、何が得られますか?なぜこうなった?私の理解では、これは何の違いもありません。しかし、そうです。そして巨大なもの。

4

1 に答える 1

0

私はあなたのコードをプロファイラーで実行します (Mali-400 をチェックしてください) が、見た目ではテクスチャ キャッシュを殺しています。計算された最初のピクセルでは、これら 4 つのテクスチャ ルックアップがすべてフェッチされますが、連続したデータもテクスチャ キャッシュにフェッチされます。次のピクセルについては、キャッシュ内のデータにアクセスしていませんが、かなり遠く (10、20 など) を見ているため、そのようなキャッシュの目的に完全に反しています。

もちろん、これは推測であり、適切なプロファイリングを行わないと判断するのは困難です。

編集: @harism もその方向を示しました。

于 2013-04-28T18:19:21.470 に答える