2013-10-10 5 views
0

Я разрабатываю игру для 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; 
    } 
} 
+0

Вы пытались переместить текстуру из этого, если? таким образом, он может быть оптимизирован с помощью gpu. – fen

+0

Да, это было еще медленнее:/ – blejzz

+0

Я не уверен, чего вы пытаетесь достичь, установив плотность на 'highp'. 'sampler2D' по умолчанию' lowp', поэтому вы не получаете никакой точности, сохраняя результат поиска в переменной 'highp'; вы просто тратите графики GPU, превращая их в 'highp', а затем создавая высокую точность' vec2' для координаты текстуры. –

ответ

0

Фигурные его. То, как я исправил это, было удалить все ветвления. Сейчас работает ~ 60 кадров в секунду. Оптимизированный код:

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); 

    lowp vec4 mix_color = texture2D(mix_texture, vec2(density, 0.0)); 
    lowp float density = texture2D(density_texture, frag_density_texcoord).a; 

    gl_FragColor = mix(mix(bg_color, terrain_color, mix_color.r), mix_color, mix_color.a);  
} 
Смежные вопросы