64

GLSLの関数dFdx()と関数を理解しようとしています。dFdy()

私は次のことを理解しています:

  1. 導関数は変化率です
  2. 2 つのパラメーターを持つ関数の偏導関数は、パラメーターの 1 つを一定に保ちながら関数を微分する場合です。
  3. dFdx()dFdy()現在のフラグメントと隣接するフラグメントの間で値が変化する割合を見つけます。

変化率の意味がわかりません。フラグメント座標の変化率ですか?

フラグメント シェーダーの 2 つの呼び出し間の任意の変数の変化率を見つけることができるのでしょうか? シェーダーの呼び出しは、隣接する呼び出しから変数を「読み取っていますか?」(単純な)例:

// invocation for fragment 1
float x = 1.0;
float d = dFdx(x);

// invocation for fragment next to fragment 1 along the x axis.
float x = 2.0;
float d = dFdx(x);

dそれぞれ -1.0 と 1.0でしょうか?

4

1 に答える 1

134

これらの命令がどのように機能するかを理解するには、GPU の基本的な実行アーキテクチャと、フラグメント プログラムがそのアーキテクチャにどのようにマップされるかを理解することが役立ちます。

GPU は、同じプログラム上で一連のスレッドを「ロックステップ」で実行します。各スレッドには、独自のレジスタ セットがあります。したがって、命令をフェッチし、実行中のスレッドごとに 1 回ずつ、その命令を N 回実行します。条件付き分岐などを処理するために、現在実行中のスレッド グループの「アクティブ マスク」もあります。マスク内でアクティブでないスレッドは実際には実行されません (したがって、それらのレジスタは変更されません)。条件付き分岐または結合 (分岐ターゲット) がある場合は常に、スレッド マスクが適切に変更されます。

フラグメント プログラムが実行されると、実行されるフラグメントは「クワッド」に配置されます。これは、スレッド グループで常に一緒に実行される 4 ピクセルの 2 x 2 の正方形です。グループ内の各スレッドは、独自のピクセル座標を認識しており、x (または y) 座標の最下位ビットを反転することで、クワッド内の隣接するピクセルの座標を簡単に見つけることができます。

GPU が DDX または DDY 命令を実行すると、隣接するピクセルのスレッドのレジスタを調べて、現在のピクセルから値を減算し、上位座標 (最下位ビット 1) の値を減算します。 ) 下位 (最下位ビット 0) から。

これは、dFdxまたはdFdyを条件分岐で使用する場合に影響します。クワッド内のスレッドの 1 つがアクティブで、もう 1 つのスレッドがアクティブでない場合、GPU は非アクティブなスレッドのレジスタを調べます。これには古い値が含まれている可能性があります。 、したがって、結果は何でもかまいません。

于 2013-05-03T23:05:16.153 に答える