0

Android/iOS 向けのゲームを開発しており、レンダリングを最適化する必要があります。このゲームでは、ユーザーが地形を変形できるので、地形にグレー スケール イメージを使用し (地形の値 1 は固体の地面を意味し、0 は地面がないことを意味します)、それにフラグメント シェーダーを適用します (背景イメージもあります)。 )。これは 60 fps の定数で非常にうまく機能しますが、問題は、地形の端に境界線もレンダリングする必要があることです。そのために、変形時にエッジをぼかし、フラグメント シェーダーで、地形の密度/透明度に基づいて境界線を描画します (境界線は 1x64 テクスチャです)。

問題は、境界線をレンダリングするときに、フレーム レートを 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;
    }
 }
4

1 に答える 1

0

理解した。私がそれを修正した方法は、すべての分岐を削除することでした。現在、最大 60 fps で実行されます。最適化されたコード:

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);       
}
于 2013-10-19T11:45:05.047 に答える