概要: スプライトに色を付けようとするとすぐにFPSの速度が低下します(つまり、テクスチャをフラグメントシェーダーで色と乗算します)。
詳細:
ハードウェア:iPod touch 4
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;
}
アルファチャネルを含む次の64x64 pngテクスチャを使用して、glEnable(GL_BLEND)でレンダリングします。
性能のみ{だけと乗算することによって、この単一の変更に起因47 FPSに低下ONE(FPSは、Xcodeの機器とOpenGL探偵を使用して測定)ベクター}。何が起こっているのですか?
ありがとう。
編集:
また、頂点カラー属性ごとに削除してみました。
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つの乗算だけですか?