Resumo: Eu fico com a desaceleração do FPS assim que tento colorir os sprites (ou seja: multiplique a textura pela cor no shader do fragmento)
Detalhes:
Hardware: iPod touch 4
Estou desenhando 700 sprites na tela usando glDrawArrays. E sim, estou agrupando tudo isso em uma única chamada de empate. A seguir, mostra a estrutura de dados do Vertex:
struct Vertex {
float Position[2];
float Color[4];
float Texture[2];
};
Sim, estou enviando cores com cada vértice porque preciso seletivamente pintar alguns sprites, mas não outros. A seguir está o shader de fragmento que estou usando:
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord );
}
Até agora está funcionando muito bem, me dando 60 FPS completos !!!
MAS
Assim que eu mudar o sombreador do fragmento para o seguinte (para permitir a coloração):
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}
Usando a seguinte textura png de 64x64, contendo canal alfa, renderizando com glEnable (GL_BLEND):
O desempenho cai para 47 FPS apenas devido a essa alteração única {apenas por multiplicação com UM vetor} (FPS medido usando instrumentos xcode e detetive OpenGL). Alguma idéia do que está acontecendo?
Obrigado.
Editar:
Eu também tentei retirar por atributo de cor do vértice:
struct Vertex {
float Position[2];
float Texture[2];
};
E modificando o sombreador de fragmento da seguinte maneira:
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);
}
Está rodando a 52 FPS para 700 sprites (um ganho de apenas 5 FPS). Portanto, isso não é interpolação, parece que a multiplicação é extremamente cara. Apenas esta multiplicação?