まず、GPUは常に2x2ピクセルのブロックのフラグメント/ピクセルシェーダーを一度に評価することを理解するのに役立ちます。(最終的にこれらのピクセルの一部だけを描画する必要がある場合でも、他のピクセルがポリゴンの外側にあるか隠れている場合でも、不要なフラグメントは最後に書き込まれる代わりにマスクされます)。
v
シェーダー内の変数(または式)のスクリーンスペース導関数は、v
この2x2ピクセルクワッドの一方の側から他方の側への(コード内のその時点での)値の差です。すなわち。ddx
値であり、v
右側の画素にマイナスの値がv
左側に、同様のためのddy
垂直では。
これv
は、「画面上で水平方向(ddx)または垂直方向(ddy)に移動すると、どれだけ速く増減するのか」と答えます。-つまり 微積分学の項では、変数の偏微分を近似します(関数の微小な振る舞いを数学的に評価するのではなく、各フラグメントで離散サンプルを使用するため、近似します)。
スカラー量の場合、これを、最も急速に増加している画面空間 ∇v = float2(ddx(v), ddy(v))
方向に沿った勾配ベクトルと見なすこともできますv
。
このタイプの情報は、テクスチャルックアップ用の適切なミップマップまたは異方性フィルタリングカーネルを選択するために内部でよく使用されます。たとえば、カメラがuv
テクスチャフロアプレーンの垂直方向にほぼ平行に見える場合は、にddy(uv.y)
比べて非常に大きくなりますddx(uv.x)
(画面で垂直軸が短縮されているため、1ピクセルのストライドがテクスチャスペースのより長いストレッチをカバーします)。エイリアシングアーティファクトを回避するために水平方向よりも垂直方向のテクスチャ方向をぼかすには異方性フィルタリングが必要であることをテクスチャサンプリングハードウェアに伝えます。
基本的な2Dテクスチャサンプリングメソッドが処理するため、ほとんどの単純な効果では、これらの派生物を使用する必要はありません。ただし、Le Comte du Merde-fouが上記のコメントで言及しているように、テクスチャルックアップを歪めている場合は、使用する画面スペースの派生物を手動で取得またはマッサージして、ハードウェアが適切なフィルタリングを選択できるようにする必要があります(例:tex2Dlod
HLSL)
スクリーンスペースデカールはそのようなケースの1つであり、1つの2x2ブロックが計算されたテクスチャ座標の大きなジャンプの不連続をカバーし、システムに単純にフィルタリングレベルを計算させると、エッジがにじんだりエイリアスになったりします。この記事では、このアーティファクトとそれを軽減するためのアプローチについて詳しく説明します。
これらの導関数は、手続き型テクスチャ生成でノイズ関数を使用している場合にも便利です。たとえば、手続き型ノイズを法線マップに変換したい場合、ddxとddyは、現在のフラグメントの近くでノイズ値がどのように変化しているか、そしてどのように傾斜しているかを計算する簡単な方法を提供します。適切な法線を構築できます。
アンチエイリアス処理された線または交差ハイライトをレンダリングする手法では、画面スペースの導関数を使用して、厚さ/フォールオフが一貫しており、ジオメトリやビュー角度に依存しないようにすることもできます。
Journeyでの砂のレンダリングに関するこの講演では、スピーカーが砂の輝きのエッジに沿ってどのようにキラキラ光るのかを制御するためにこれらの派生関数を使用した可能性があると述べました...ボンネットの下には、とにかくこれらの種類の誘導体が搭載されています)
注意すべき最後の注意:画面空間の導関数は、「粗い」/低精度(1組の導関数がクワッド全体で共有されることを意味する)または「細かい」/高精度(各ピクセルがその直接のみと比較されることを意味する)で計算できます。クワッド内の隣人。クワッド上に4つの異なる微分ペアを与える可能性があります)。一般的に粗いもので十分ですが、エフェクトで2x2ブロックが表示されていることに気付いた場合は、細かい/高精度に切り替えるとよいでしょう。;)
(上の図では、細かい導関数の計算を使用しましたが、ddx / ddyだけではデフォルトで粗い導関数になることに注意してください)