Я пишу 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?