2013-05-24 3 views
1

Резюме: я получаю 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). Так что это не интерполяция, кажется, что умножение чрезвычайно дорого. Только это одно умножение?

ответ

0

По моему опыту альфа-смешивание имеет тенденцию к снижению частоты кадров довольно быстро, особенно на старых устройствах. Я предполагаю, что умножение этого цвета на самом деле связано с большим количеством дополнительных вычислений для графического процессора (для учета и умножения цвета уже в фреймбуфере). Честно говоря, если вы все еще на 47 кадров в секунду на iPod Touch 4-го поколения, похоже, что вы делаете очень хорошо. Вероятно, вы вернетесь до 60 на более новом устройстве. Если вы делаете ставку на призыв к розыгрышу, на такой простой шейдер не намного больше оптимизируется.

Вы можете попробовать рендерить все спрайты, где цвет назначения не будет влиять на конечный цвет сначала как отдельную партию, используя ваш исходный шейдер текстурного поиска, а затем нарисуйте остальные, используя шейдер, который умножает цвет, но накладные расходы сортировка, возможно, не стоит того.

EDIT

Существует другой SO ответ here, что могло бы быть больше, что вы ищете. В основном это говорит о том, что умножение с высокой точностью с плавающей запятой в шейдере фрагмента может привести к снижению производительности. Возможно, вы сможете вручную установить точность вашего сэмплера ниже и повысить производительность таким образом.

+0

Ну, как я уже упоминал в вопросе, я уже получаю 60 FPS на iPod 4 при рендеринге 700 спрайтов. ** BUT **, как только я применил оттенок в шейдере фрагмента (т. Е. Умножьте цвет на текстуру), FPS внезапно опустится до 47 FPS. Селективный рендеринг - это хорошая идея, спасибо :). Но можете ли вы указать причину замедления? Он просто умножает 2 вектора !! – fakhir

+0

Так что я, как правило, вижу на своем iPhone 4, состоит в том, что чем сложнее я делаю свои шейдеры фрагментов, тем быстрее мои капли fps. Особенно, когда у меня есть поиск текстур и/или альфа-смешивание. Даже очень простые вычисления могут быстро снижать fps на старых устройствах. Честно говоря, я не знаю достаточно о внутренней работе OpenGL, чтобы объяснить, почему это так, но я предполагаю, что простое умножение просто приводит к тому, что ваше оборудование находится чуть ниже его максимального порога fps. –

+0

Я отредактировал этот вопрос, чтобы добавить новую информацию. В основном я уже использую lowp :). Я также пытался умножить постоянный цветной вектор (см. Выше). Теперь я получаю 52 FPS. Капля 8 FPS из-за только ОДНОГО умножения? Кажется, что векторное умножение очень дорого. – fakhir