Вывод: я получаю замедление FPS, как только пытаюсь подкрасить спрайты (т. е. умножить текстуру на цвет во фрагментном шейдере).
Подробности:
Аппаратное обеспечение: iPod touch 4
Использование текстуры png 64x64, содержащей альфа-канал, рендеринг с помощью glEnable(GL_BLEND). (смайлик с тенью)
Я рисую 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 кадров в секунду !!!
НО
Как только я изменю фрагментный шейдер на следующий (чтобы разрешить тонировку):
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D( TextureSampler, TexCoord ) * DestinationColor;
}
Производительность падает до 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). Так что это не интерполяция, кажется, что умножение чрезвычайно дорого. Только это ОДНО умножение?