3

私のフラグメント シェーダーには、次の 2 行があります:</p>

float depthExp=max(0.5,pow(depth,100.0));
gl_FragColor=vec4(depthExp*vec3(color),1);

私はそれを「最適化」します:</p>

if(depth<0.99309249543703590153321021688807){//0.5^(1/100.0)
    gl_FragColor=vec4(0.5*vec3(color),1);
}else{
    float depthExp=pow(depth,100.0);
    gl_FragColor=vec4(depthExp*vec3(color),1);
}

これでパフォーマンスが上がるの?それとも私は自分の意志に反してやるだけですか?


ここに完全なフラグメント シェーダーを示します。最適化する機会があるかどうかを確認します。

varying vec2 TexCoord;
uniform sampler2D Texture_color;
uniform sampler2D Texture_depth;
uniform sampler2D Texture_stencil;
void main() 
{ 
     float depth=texture2D(Texture_depth,TexCoord).r;
     float stencil=texture2D(Texture_stencil,TexCoord).r;
     vec4 color=texture2D(Texture_color,TexCoord); 
     if(stencil==0.0){
           gl_FragColor=color;
     }else{
           float depthExp=max(0.5,pow(depth,100.0));
           gl_FragColor=vec4(depthExp*vec3(color),1);       
     }
} 
4

2 に答える 2

2

まず、シェーダーで過度に分岐することは、通常は良い考えではありません。最新のハードウェアでは、近くのフラグメントがすべて同じブランチを取る限り、それほど悪くはありません。しかし、フラグメントのローカル パケットの 2 つのフラグメント (サイズは実装に依存し、おそらく 4x4-8x8 などの小さな正方形) が異なるブランチを取ると、GPU は実際にはパケットのフラグメントに対して両方のブランチを実行する必要があります。

そのため、近くのフラグメントが同じ分岐を取る可能性が高い場合、何らかの改善が得られる可能性があります。条件は深度に基づいており (以前のレンダリングからだと思いますが)、深度バッファーは通常、単調な深度分布を持つより大きな領域で構成されているため、近くのフラグメントが同じ分岐に入る可能性は実際にあります。また、最適化された分岐はほとんどのフラグメントに対して実行されるため (ほとんどのフラグメントは 0.993 よりも小さく、深度バッファーの非線形性と小さい値での精度が高いため、さらに小さいため)、利益が得られる可能性があります。しかし、Apeforceが示唆するように、最良のアイデアはそれを測定することです。

しかし、これは私に別の質問をもたらします。背景を除いて、通常のシーンの事実上すべてのフラグメントの深度が 0.993 より小さいと仮定すると、値のほとんどは、100 で累乗 (man0.95^100 = 0.005および0.9^100 = 0,00002) し、色 (精度と影響とにかく、最初の場所での認識はそれほど高くありません)この量によって、おそらくそれをゼロにするだけです. したがって、実際に [0,1] からの値を持つ標準的な深度バッファがある場合 (通常のように非線形でpowある場合もあります)、とにかくこれの実際の目的が何であるか、おそらく問題に対する別の解決策があるかどうか疑問に思います。 .

于 2012-10-01T09:53:22.450 に答える
1

通常、シェーダー内で分岐することは何としてでも避けたいと思うでしょう。おそらく、最初からそのままにしておく方がよいでしょう。最新の GPU の方が優れていると聞きましたが (分岐ステートメント)、OpenGL ES 2.0 または OpenGL 3.2+ の何のために書いていますか? さまざまな使用法は、OpenGL ES 用に書いていることを示唆していますか?

最初に元のシェーダーを使用し、次に「最適化された」シェーダーを使用して、コンソール (パフォーマンスに影響しますが、どちらの場合も問題ないため) または画面に fps を書き出すことをお勧めします。どちらがより高いフレームを取得するかを確認してください。

ただし、一般に、分岐条件を使用してシェーダー プログラムを最適化することはできません。これは非常に後方に感じられますが、それはハードウェアの動作が原因です。

于 2012-10-01T08:46:03.243 に答える