Почему одно умножение Vec4 так сильно замедляет мой фрагментный шейдер ogl es 2? - PullRequest
7 голосов
/ 01 апреля 2011

Я пишу 2D-игру OpenGL для устройств iOS. Прямо сейчас я смотрю на производительность на iPad (первого поколения). В игре есть пути кода для ogl 1.1 и 2.0, и я могу выбрать, какой из них используется с #define.

При использовании ogl 2.0, профилировщик говорит мне, что мой% использования рендерера довольно устойчивый 100%, и моя частота кадров составляет около 30 кадров в секунду. При использовании ogl 1.1, профилировщик говорит мне, что мой коэффициент использования Renderer% равен ~ 60%, а частота кадров 60 кадров в секунду.

Я хочу улучшить производительность с ogl 2.0, и, поскольку скорость заполнения ограничена, я подозревал фрагментный шейдер. Вот фрагментный шейдер, который использовался:

precision highp float;
uniform vec4 u_color;
uniform sampler2D u_sampler0;
varying vec2 v_texCoord;

void main()
{
    gl_FragColor = u_color * texture2D( u_sampler0, v_texCoord );
}

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

precision highp float;
uniform vec4 u_color;
uniform sampler2D u_sampler0;
varying vec2 v_texCoord;

void main()
{
    gl_FragColor = texture2D( u_sampler0, v_texCoord );
}

Профилирование кода с использованием этого модифицированного шейдера дало% использования рендерера ~ 60% и частоту кадров 60 кадров в секунду, такую ​​же производительность достигла кодовая дорожка ogl 1.1.

Мой вопрос:

1) Должно ли простое умножение Vec4 во фрагментном шейдере действительно оказывать такое большое отрицательное влияние на производительность?

2) Я слышал, что на устройствах ogl es 2 функциональность 1.1 реализована с помощью шейдеров. Очевидно, что этим шейдерам удается эффективно достичь эффекта, которого я добиваюсь (смешивая цвет geom с цветом текстуры). Как эффективно добиться этого эффекта в моем шейдере ogl 2?

1 Ответ

7 голосов
/ 01 апреля 2011

Причина, по которой ваш шейдер медленнее, чем встроенные шейдеры ES1.1, заключается в том, что вы умножаете 4 значения высокой точности (Float32), а не 4 значения низкой точности (фиксированная точка, от -2 до 2).

Измените uniform vec4 u_color на uniform lowp vec4 u_color, и вы увидите ту же производительность, что и ES 1.1.

...