画面スペースの派生物とは何ですか、いつ使用しますか?


11

私が見るddxddyGLSLの機能をし、HLSL同等物は、すべての今してシェーダコードに出てきます。私は現在それらを使用して、接線または接線なしでバンプマッピングを行っていますが、基本的にコードをコピーして貼り付けました。これらの関数が実際に何であるか、それらが何をするのか、いつ使用するのかを理解できません。

だから質問:

  1. スクリーンスペース微分関数とは何ですか?
  2. これらの関数は何をしますか?入力値と出力値
  3. 最も一般的に使用される効果は何ですか?
  4. これらの機能に目を向けるには、どのような効果が必要ですか?

過去に、これらをテクスチャワープに使用しましたが、ワープが一部のフラグメントに対して誤ったミップレベルを選択する可能性があります。通常はミップレベルが低いため、ワープするにつれて、テクスチャが細かくはっきりとシフトして見えるのがわかります。ワープされていないtexcoordsの導関数を取得し、次にワープを計算してから、ワープされたtexcoordsおよび導関数でtex2Dgrad / SampleGrad / textureGradを使用すると、これが発生しなくなります。
Maximus Minimus

@ LeComteduMerde-fouテクスチャワープとは 簡単なグーグルはあなたがラップを意味することを示唆していますか?
NeomerArcana 2016年

いいえ、私はワープを意味します。つまり、時間の経過とともにテクスチャコードを変更することによってテクスチャを歪めます。
Maximus Minimus

この関連質問を参照してください。リンクされた質問は、より高いレベルの「これは何で何がいいのか」ではなく、これらの関数の機能/計算方法についてより多くのことを求めているためです。
DMGregory

こんにちは私はこれ非常に興味があります。現在それらを使用して、接線または接線なしでバンプマッピングを行っていますが、基本的にコードをコピーして貼り付けました。...私はそのためにそれを使用することを考えていました...しかし、いくつかの安価な線形代数を使用して、これらのスクリーン空間導関数をワールド空間法線に変換する方法がわかりません。おそらく、カメラ投影行列の逆が必要です。
Prokop Hapala 2017

回答:


12

まず、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が上記のコメントで言及しているように、テクスチャルックアップを歪めている場合は、使用する画面スペースの派生物を手動で取得またはマッサージして、ハードウェアが適切なフィルタリングを選択できるようにする必要があります(例:tex2DlodHLSL)

スクリーンスペースデカールはそのようなケースの1つであり、1つの2x2ブロックが計算されたテクスチャ座標の大きなジャンプの不連続をカバーし、システムに単純にフィルタリングレベルを計算させると、エッジがにじんだりエイリアスになったりします。この記事では、このアーティファクトとそれを軽減するためのアプローチについて詳しく説明します。

これらの導関数は、手続き型テクスチャ生成でノイズ関数を使用している場合にも便利です。たとえば、手続き型ノイズを法線マップに変換したい場合、ddxとddyは、現在のフラグメントの近くでノイズ値がどのように変化しているか、そしてどのように傾斜しているかを計算する簡単な方法を提供します。適切な法線を構築できます。

アンチエイリアス処理された線または交差ハイライトをレンダリングする手法では、画面スペースの導関数を使用して、厚さ/フォールオフが一貫しており、ジオメトリやビュー角度に依存しないようにすることもできます。

Journeyでの砂のレンダリングに関するこの講演では、スピーカーが砂の輝きのエッジに沿ってどのようにキラキラ光るのかを制御するためにこれらの派生関数を使用した可能性があると述べました...ボンネットの下には、とにかくこれらの種類の誘導体が搭載されています)

注意すべき最後の注意:画面空間の導関数は、「粗い」/低精度(1組の導関数がクワッド全体で共有されることを意味する)または「細かい」/高精度(各ピクセルがその直接のみと比較されることを意味する)で計算できます。クワッド内の隣人。クワッド上に4つの異なる微分ペアを与える可能性があります)。一般的に粗いもので十分ですが、エフェクトで2x2ブロックが表示されていることに気付いた場合は、細かい/高精度に切り替えるとよいでしょう。;)

(上の図では、細かい導関数の計算を使用しましたが、ddx / ddyだけではデフォルトで粗い導関数になることに注意してください)


2x2ブロックの一方の側からもう一方の側へのピクセルの違いだと言うとき、それはピクセル値の違いですか、それともテクセル位置の違いですか?それが値の違いである場合、それはその間のテクセルを合計しますか?
NeomerArcana 2016年

これは引数の値(vここ)の違いです。2x 2のクワッドであるため、間にピクセルはありません。したがって、クワッドの左上フラグメントをシェーディングしていて、v = 1であり、右上フラグメントv = 4の場合、ddx(v)= 3(「vは、移動するにつれて3ずつ増加すると言います左から右へ」)
DMGregory

まだよくわかりません。斜めから見ている場合、2x2ブロックはテクスチャ内のピクセルが並んで構成されていない可能性があります。値の違いは、2つの選択されたテクセル間の違いですか、それとも、スキップされたものを考慮した2つの選択されたテクセル間の違いですか?
NeomerArcana 2016年

テクセルを忘れます—テクスチャをサンプリングしていません。ddxまたはddyに渡した引数のリテラル値を取得し、隣接するフラグメントを評価するときに、それをddxまたはddyに渡した値と比較しています。その値がたまたまテクスチャサンプルからのものである場合はそうですが、微分関数にはテクスチャに関する知識がありません。彼らはただ数を引く。PCに戻ったら、この回答に図を追加してみます。
DMGregory

ああ、もう理解できたと思います。図を取得するのは素晴らしいことですが、私は理解していると思います。これらは非常に便利な機能のようです。
NeomerArcana 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.