Резюме: я получаю замедление FPS, как только я пытаюсь тонировать спрайты (то есть: умножить текстуру на цвет в фрагментном шейдере)
Подробности:
Аппаратное обеспечение: iPod touch 4
Я рисую 700 спрайтов на экране, используя glDrawArrays. И да, я собираю все это в один розыгрыш. Ниже показана структура данных Vertex:
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 только из-за этого единственного изменения {просто умножением на ОДИН вектор}} (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);
}
Он работает на скорости 52 FPS для 700 спрайтов (усиление всего 5 FPS). Так что это не интерполяция, кажется, что умножение очень дорого. Только это ОДНО умножение?