2013-05-03 31 views
33

私はGLSLのdFdxとdFdy関数を理解しようとしています。dFdxの説明

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

  1. 誘導体は変更
  2. の割合である二つのパラメータを持つ関数の偏微分は、一定のパラメータの一つを維持しながら、あなたが機能を区別する場合です。
  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になるでしょうか?

+5

[こちら](http://www.opengl.org/discussion_boards/showthread.php/176425-How-are-dFdx-and-dFdy-functions-implemented)に関する良い議論があります。 – user1118321

答えて

82

これらの命令の仕組みを理解するためには、GPUの基本的な実行アーキテクチャと、そのプログラムにどのようにフラグメントプログラムをマップするのかを理解することが重要です。

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

フラグメントプログラムが実行されるとき、実行されるフラグメントは、常に4つのピクセルの2x2の四角形で「スレッド」グループにまとめられます。グループ内の各スレッドは、それ自身のピクセル座標を知っており、x(またはy)座標の最下位ビットを反転することによって、クワッド内の隣接ピクセルの座標を容易に見つけることができる。

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

条件分岐でdFdxまたはdFdyを使用すると、これは意味を持ちます.4つのスレッドの一方がアクティブで、他方がアクティブでない場合、GPUはまだ非アクティブなスレッドのレジスタを調べます。その中に古い値があるので、結果は何でもかまいません。

+3

この説明はとても役に立ちます。私はコメントの中でこう言いたかったのです。ありがとう@ChrisDodd。 –

+0

これについてたくさん読んでみると、私も参加してくれてありがとう@ChrisDodd。これは非常に有益かつ洞察力があった。 – Mathias

+1

あなたの説明は優れています - この動作を説明する文書はどこにありますか? –