Я разрабатываю игру для Android/iOS и нуждаюсь в оптимизации рендеринга. Игра позволяет пользователю деформировать ландшафт, поэтому я использую изображение серой шкалы для местности (значение 1 в рельефе означает сплошную землю, а 0 означает отсутствие основания) и применение на нем фрагментарного шейдера (также есть фон образ). Это очень хорошо работает с постоянной частотой 60 кадров в секунду, но проблема в том, что мне также необходимо отобразить границу на краю ландшафта. Поэтому для этого я размываю края при деформировании, а в шейдере фрагмента я рисую границу на основе плотности/прозрачности ландшафтов (граница - текстура 1x64).opengl es 2.0 - оптимизирующий фрагмент шейдера
Проблема в том, что при визуализации границы мне нужно сделать динамическое чтение текстуры, которое снижает частоту кадров до 20. Есть ли способ, который я мог бы оптимизировать? Если бы я заменил текстуру границы равномерным массивом float, она бы помогла или она будет такой же, как чтение из 2d-текстуры?
Код шейдера:
varying mediump vec2 frag_background_texcoord;
varying mediump vec2 frag_density_texcoord;
varying mediump vec2 frag_terrain_texcoord;
uniform sampler2D density_texture;
uniform sampler2D terrain_texture;
uniform sampler2D mix_texture;
uniform sampler2D background_texture;
void main()
{
lowp vec4 background_color = texture2D(background_texture, frag_background_texcoord);
lowp vec4 terrain_color = texture2D(terrain_texture, frag_terrain_texcoord);
highp float density = texture2D(density_texture, frag_density_texcoord).a;
if(density > 0.5)
{
lowp vec4 mix_color = texture2D(mix_texture, vec2(density, 1.0)); <- dynamic texture read (FPS drops to 20), would replacing this with a uniform float array help (would also need to calculate the index in the array)?
gl_FragColor = mix(terrain_color, mix_color, mix_color.a);
} else
{
gl_FragColor = background_color;
}
}
Вы пытались переместить текстуру из этого, если? таким образом, он может быть оптимизирован с помощью gpu. – fen
Да, это было еще медленнее:/ – blejzz
Я не уверен, чего вы пытаетесь достичь, установив плотность на 'highp'. 'sampler2D' по умолчанию' lowp', поэтому вы не получаете никакой точности, сохраняя результат поиска в переменной 'highp'; вы просто тратите графики GPU, превращая их в 'highp', а затем создавая высокую точность' vec2' для координаты текстуры. –