概要: スプライトに色を付けようとするとすぐに 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つの乗算だけですか?