0

何かをチェックしたところ、C++ と OpenGL と GLSL のパフォーマンスについて奇妙な結果が得られました。

最初のプログラムでは、フラグメント シェーダーを使用してテクスチャにピクセルを描画し、テクスチャをレンダリングしました。テクスチャの mag\min は でしたGL_NEAREST

2 番目のプログラムでは、フラグメント シェーダーを使用して画面に直接レンダリングしました。

2 番目のプログラムの方が速いのはなぜですか? 同じアクションを繰り返すよりも、テクスチャのレンダリングが高速ではありませんか?

これは、AAA ゲームのビデオを撮影して同じコンピューターで表示し、ビデオの FPS を下げるようなものです。

フラグメント シェーダーは次のとおりです。

uniform int mx,my;

void main(void) {
    vec2 p=gl_FragCoord.xy;
    p-=vec2(mx,my);
    if (p.x<0.0)
        p.x=-p.x;
    if (p.y<0.0)
        p.y=-p.y;
    float dis=sqrt(p.x*p.x+p.y*p.y);
    dis+=(abs(p.x)+abs(p.y))-(abs(p.x)-abs(p.y));
    p.x/=dis;
    p.y/=dis;
    gl_FragColor=vec4(p.x,p.y,0.0,1.0);
}
4

1 に答える 1

5

パフォーマンスに関する質問でよくあることですが、確実に確認する唯一の方法は、プロファイラーを使用することです。

そうは言っても、これは主に処理帯域幅とメモリ帯域幅の問題であると思います。テクスチャをレンダリングするには、プロセッサはメモリの一部からデータを読み取り、同じデータをメモリの別の部分に書き戻す必要があります。

シェーダーから直接レンダリングするには、プロセッサは出力をメモリに書き込むだけでよく、メモリからデータを読み取る必要はありません。

したがって、特定のデータをメモリから読み取るのと、プロセッシング ユニットで生成するのとでは、どちらが速いかという問題があります。シェーダーの計算は非常に単純です (本質的に複雑な部分は だけですsqrt)。少なくとも特定のハードウェアでは、メモリから読み取るよりも結果を計算する方が少し速いようです (少なくとも与えられた場合)。同時に進行している他のメモリアクセスなど)

この 2 つ (シェーダーとテクスチャー) の特性はまったく異なることに注意してください。テクスチャの読み取りは、その作成に関連する計算がどれほど単純であるか複雑であるかに関係なく、ほぼ一定の速度になります。明白なことは言いませんが、計算が単純な場合、シェーダーは高速に実行されますが、計算が複雑になると (潜在的に大幅に) 遅くなります。あなたが言及した AAA ゲームでは、少なくとも一部のシェーダーは複雑な計算を使用しているため、テクスチャの読み取りよりもほぼ確実に遅くなると推測できます。反対に、非常に単純なシェーダー (たとえば、フラグメント カラーを入力から出力に渡すだけのシェーダー) は、おそらくテクスチャから読み取るよりもはるかに高速です。

于 2012-12-11T03:59:56.593 に答える