1

シェーダーを作成する上で分岐が良いアイデアではないことはわかっていますが、それを回避する方法は思いつきませんでした。これが私のフラグメントシェーダーコードです:

precision highp float;

varying vec4 v_fragmentColor;
varying vec4 v_pos;

uniform int u_numberOfParticles;

uniform mat4 u_MVPMatrix;

uniform vec3 u_waterVertices[100];

void main()
{
    vec4 finalColor = vec4(0.0, 0.0, 0.0, 0.0)

    vec2 currPos = v_pos.xy;

    float accum = 0.0;
    vec3 normal = vec3(0, 0, 0);

    for ( int i = 0; i < u_numberOfParticles; ++i )
    {
        // Some calculations here
    }
    normal = normalize(normal);

    float normalizeToEdge = 1.0 - (accum - threshold) / 2.0;

    if (normalizeToEdge < 0.3)
        finalColor = vec4( 0.1, normalizeToEdge + 0.5, 0.9-normalizeToEdge*0.4, 1.0);

    if ( normalizeToEdge < 0.2 )
    {
        finalColor = vec4( 120.0/255.0, 245.0/255.0, 245.0/255.0, 1.0);
        float shade = mix( 0.7, 1.0, normal.x);
        finalColor *= shade;
    }


    gl_FragColor = vec4(finalColor);

}

問題はここにあります:

for ( int i = 0; i < u_numberOfParticles; ++i )
{
     // Some calculations here
}

に変更します:

for ( int i = 0; i < 2; ++i )
{
    // Some calculations here
}

u_numberOfParticles も 2 ですが、フレームレートを 2 倍にします。

それをに変更する

   for ( int i = 0; i < 100; ++i )
   {
       if( i == u_numberOfParticles)
            break;
       // Some calculations here
   }

fps の改善はありません。

このようなシェーダーの動作にどのように対処できますか? この分岐を回避するテクニックはありますか? パーティクルの数が異なる場合に 50 の異なるシェーダーを作成するのは効率が悪いと思います。

4

0 に答える 0