Резюме: я получаю FPS замедление, как только я пытаюсь подкрасить спрайтов (то есть: умножают текстуры с цветом в пиксельный шейдер)GL ES: Фрагмент оптимизации шейдера
Детали:
Оборудование: 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);
}
До сих пор она работает GREAT, давая мне полный 60 FPS !!!
НО
Как только я изменить фрагмент шейдера к следующему (к возможности тонировки):
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoord;
uniform sampler2D TextureSampler;
void main(void)
{
gl_FragColor = texture2D(TextureSampler, TexCoord) * DestinationColor;
}
Производительность падает до 47 FPS только из-за одного этого изменения {только путем умножения ONE vector} (FPS измеряется с использованием инструментов xcode и детектора OpenGL). Любые идеи, что происходит?
Спасибо.
Edit:
Я также попытался вырезают на вершине атрибута цвета:
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). Так что это не интерполяция, кажется, что умножение чрезвычайно дорого. Только это одно умножение?
Ну, как я уже упоминал в вопросе, я уже получаю 60 FPS на iPod 4 при рендеринге 700 спрайтов. ** BUT **, как только я применил оттенок в шейдере фрагмента (т. Е. Умножьте цвет на текстуру), FPS внезапно опустится до 47 FPS. Селективный рендеринг - это хорошая идея, спасибо :). Но можете ли вы указать причину замедления? Он просто умножает 2 вектора !! – fakhir
Так что я, как правило, вижу на своем iPhone 4, состоит в том, что чем сложнее я делаю свои шейдеры фрагментов, тем быстрее мои капли fps. Особенно, когда у меня есть поиск текстур и/или альфа-смешивание. Даже очень простые вычисления могут быстро снижать fps на старых устройствах. Честно говоря, я не знаю достаточно о внутренней работе OpenGL, чтобы объяснить, почему это так, но я предполагаю, что простое умножение просто приводит к тому, что ваше оборудование находится чуть ниже его максимального порога fps. –
Я отредактировал этот вопрос, чтобы добавить новую информацию. В основном я уже использую lowp :). Я также пытался умножить постоянный цветной вектор (см. Выше). Теперь я получаю 52 FPS. Капля 8 FPS из-за только ОДНОГО умножения? Кажется, что векторное умножение очень дорого. – fakhir