web-dev-qa-db-ja.com

dFdxの説明

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

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

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

変化の速度が何を指しているのか分かりません。フラグメント座標の変化率ですか?

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

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

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

Dはそれぞれ-1.0と1.0になりますか?

46
bwroga

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

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

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

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

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

104
Chris Dodd