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とか)を与えることもできる。ベクトルを与えた場合は、各要素で独立して差分を求める。