Raymarchシェーダーはどのように機能しますか?


49

ここshadertoy.comで見られるシェーダーを見てきましたが、クールなもののほとんどはノイズとレイマーチが共通しています。私はソースコードをまったく理解していませんが、本当にしたいです。これらのシェーダーはどのように機能し、raymarchアルゴリズムはどのように機能しますか?私はあちこち検索しましたが、トピックについては何も見つかりません。

ありがとう


6
IñigoQuilezはそれについて優れたチュートリアルを書いています。参照iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htmiquilezles.org/www/material/nvscene2008/nvscene2008.htmiquilezles.org/www/articles/distfunctions/distfunctions.htmを。これらのクールなシェーダーは、レイマーチングだけでなく、具体的には球体トレースとも呼ばれるレイマーチング距離フィールドです。
msell

一般的なレイマーチングまたはGPUでのレイマーチングについて質問していますか?
concept3d

@Milo質問を明確にしてください。これらのアルゴリズムを使用して、クールなデモで表示される画像を生成する方法を尋ねていますか?レイマーチングの仕組みをお尋ねですか?フラグメント/ピクセルシェーダーでのレイマーチング(つまり、効率的な実装)がどのように機能するかを尋ねていますか?
TravisG

回答:


78

レイトレーシングとは対照的に理解するのがおそらく最も簡単でしょう。

レイトレーシングでプリミティブをレンダリングするには、プリミティブと入力レイが与えられ、そのレイがプリミティブに当たる場所を正確に示す関数が必要です。次に、関連するすべてのプリミティブに対してレイをテストし、最も近い交差点を選択します。CPUはこれが得意です。

レイマーチングでは、このような単純なレイインターセクション関数はありません。光線上のポイントが与えられると、ポイントがサーフェスにどれだけ近いかを推定できますが、サーフェスに到達するためにその光線をどれだけ延長する必要があるかは正確にはわかりません。

したがって、一度に1ステップずつ「行進」します。

  1. レイの「始まり」から開始します-シーンレンダリングのニアプレーン、またはシーン内のオブジェクトが1つだけの場合は境界ボリュームとの交差点。(下図のP0)

  2. 距離関数を評価して、表面にどれだけ近いかを推定します。(図の最大の円)

  3. 推定に従って光線に沿って前進します。移動は控えめに短くする必要があります。そのため、どこでも地表をトンネルしないと確信しています。

  4. これで新しいポイント(以下のP1)ができました-新しい見積もりを取得して繰り返します。

  5. サーフェスのしきい値距離内に到達するか、最大ステップ数に達するまで、推定値の取得と前進を続けます。(以下のP4)

  6. これで表面の深さが得られ、近くのサンプルから法線/アンビエントオクルージョンなどを推測し、このデータを使用してピクセルを照らし、色を付けることができます。

P0からその交差点に向かって光線を行進

GPU Gems 2、第8章のサンプル図

各レイは独立しており、各ステップで(一般に)ローカル情報のみを使用するため、GPUでの並列化に適しています。多くの場合、画面には2つの三角形のみが描画されます。これらをラスタライズした後、フラグメントシェーダーに渡される各ピクセルは単一の光線を表します。フラグメントシェーダーは、サーフェスに到達するまでそのレイを行進し、結果を返します(多くの場合、個別のフルスクリーンパスでのテクスチャリングとシェーディングの深度値のみ)。

正確な手順は、達成しようとしている特定の効果に大きく依存します。レイマーチングテクニックは以下で使用されます...

  • 従来のラスタライズされたジオメトリの表面変位をシミュレートする高さフィールド(視差オクルージョンマッピング)
  • スクリーンスペース反射のようなもののためのシーン深度バッファ
  • 3Dサンプリングされたデータセットを視覚化するためのボリュームテクスチャ(多くの場合科学/医療)
  • フラクタルのようなものをレンダリングするための暗黙的な関数
  • IñigoQuilezの作品のような手続き型の距離フィールド(上記のコメントのmsellからのすばらしいリンク)。

Wikipediaのこの例のように、レイマーチングは、ボリュームの半透明度をレンダリングするために、各ステップでのブレンド(多くの場合、毎回距離を推定する代わりに固定ステップを使用)で使用されます。

半透明のボリュームテクスチャのレイマーチング

これは、詳細なクラウドをリアルタイムでレンダリングする一般的な方法になりました。

建物の窓の背後にある室内の詳細をシミュレートするインテリアマッピングでさえ、レイマーチングの一種と考えることができます。レイマーチングは、光線が窓に入る点から最も近い壁、床/天井、または家具の平面に進むステップです。

興味のある特定のタイプのレイマーチング効果がある場合、特定の例を使用して新しい質問をすることで、より詳細な回答を得ることができます。家族として、この手法はあまりにも多様であるため、すべてを1つの短い答えでカバーすることはできません。;)これにより、これらのシェーダーの内部で何が起こっているのかを理解するためのフレームワークが得られることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.