もさぷい

ゲーム、3D関連技術ついて

DirectXのシェーダ(HLSL)における勾配関数ddx ddyの挙動調査

DirectXのシェーダ(HLSL)で使う勾配関数ddx ddyが行う、

具体的な演算方法がよく分からないので、調査した。(DirectX9)

DirectXのヘルプを読んでも、どのように傾きを求めているのかがわからない。


調査の方法:

浮動小数テクスチャに調べやすそうな任意の値を書き込んで、デバッグを使って、地道にデータを見て、調べた。

 

結果:

次のような結果となった。

 

ddxの場合:

入力データ[0, 1, 4, 9, 16, 25, 36, 49] → 出力データ[1, 1, 5, 5, 9, 9, 13, 13]

この結果より、二つのピクセル値を使って、傾き(ただの差分である。右 - 左)を求め、二つのピクセルにその傾きを格納している。

(上の結果の 0, 1 は、差分を取ると1-0 == 1となる。その1を対応する二つの出力ピクセルに入れている。)

(上の結果の 4, 9 は、差分を取ると9-1 == 5となる。その5を対応する二つの出力ピクセルに入れている。)

ddyの場合:

ddxと同様な処理をy軸方向に行っていた。

 

まとめ:

ddxとddy関数は、隣り合う二つのピクセルの値を使い、その二つのピクセルの差分(右 - 左)を取り、その結果を対応する二つの出力ピクセルに格納する関数である。

ddx,ddyは、ベクトルデータ(float2,float3,float4とか)を与えることもできる。ベクトルを与えた場合は、各要素で独立して差分を求める。