1

概要: スプライトに色を付けようとするとすぐに FPS の速度が低下します (つまり、フラグメント シェーダーでテクスチャに色を乗算します)。

詳細:

ハードウェア: iPod touch 4

アルファ チャネルを含む 64x64 の png テクスチャを使用し、glEnable(GL_BLEND) でレンダリングします。(ドロップ シャドウ付きのスマイリー フェイス)

glDrawArrays を使用して、画面上に 700 個のスプライトを描画しています。はい、これらすべてを 1 回の描画呼び出しでバッチ処理しています。以下は、頂点データ構造を示しています。

struct Vertex {
    float Position[2];
    float Color[4];
    float Texture[2];
};

はい、一部のスプライトを選択的に着色する必要があるため、各頂点で色を送信しています。以下は、私が使用しているフラグメント シェーダーです。

varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;

void main(void)
{
    gl_FragColor = texture2D( TextureSampler, TexCoord );
}

今のところ、完全に 60 FPS を達成しており、非常にうまく機能しています !!!

しかし

フラグメント シェーダーを次のように変更するとすぐに (着色を許可するため):

varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;

void main(void)
{
    gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}

この単一の変更により、パフォーマンスは 47 FPS に低下します {1 つのベクトルを乗算するだけで} ( xcode機器と OpenGL 検出を使用して測定された FPS)。何が起こっているのですか?

ありがとう。

編集:

また、頂点カラー アトリビュートごとに削除しようとしました。

struct Vertex {
    float Position[2];
    float Texture[2];
};

また、フラグメント シェーダーを次のように変更します。

precision lowp float;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;

void main(void)
{
    gl_FragColor = texture2D( TextureSampler, TexCoord ) * vec4(1.0,0.0,0.0,1.0);
}

700 個のスプライトに対して 52 FPS で実行されています (わずか 5 FPS のゲイン)。したがって、これは補間ではなく、乗算は非常に高価なようです。この1つの乗算だけですか?

4

1 に答える 1