私は現在、スムーズプロシージャジオメトリを表示するレンダリング手法として符号付き距離フィールドを使用するゲームエンジンを開発しています(リンクのような単純なプリミティブで生成され、将来はJuliaとIFSフラクタルを実装する予定です)。私のエンジンは手続き型の生成に焦点を当てており、レイマーチャーに優しい方法で図を定義する必要があるため、この質問に答えるのに適した場所にいると思います。
ストリーミングに関しては、単純な解決策は、ある種の型付きバッファを使用して、レイマーチングを行いたいときにGPUにスローすることです。バッファの各要素は複合型(C / C ++の構造体など)であり、各型には、それを表すために使用する必要がある関数、位置、回転、スケールなど、および平均色を定義する要素が含まれています。次に、プロセスは次のように簡略化されます。
- シーンを管理可能なサブセットにカリングします(錐台カリングとオクルージョンカリングは、とにかく光線進行アルゴリズムによって部分的に自動的に実行されることに注意してください)。
- サブセットをレンダー入力バッファーに渡す
- バッファがない場合はバッファをGPUに渡し、通常の従来のレイマーチングでシーンをレンダリングします。レイマーチャーの反復ごとに、入力バッファー内のどのアイテムが各レイに最も近いかを評価するために、ある種のステップごとの検索を実行する必要があります。また、どちらかのレイに変換を適用する必要があります(その場合) GPUに到達する前にFigureの回転を反転する必要があります)または距離関数自体(位置の変更のために関数の原点を移動し、スケールの変更のために3次の辺の長さを調整するなど)。最も単純なアプローチは、前に光線を変更することですそれらを実際のコア距離関数に渡します。
図の色については、シェーダーを使用すると、プリミティブだけでなく複雑なタイプも定義できることに注意してください;)。これにより、すべてをCスタイルの構造体にスローし、それらの構造体を距離関数から返すことができます。
私のエンジンでは、各構造体には、距離、色、および入力バッファー内の対応するFigure定義に関連付けるIDが含まれています。各IDは、関連する距離関数の周囲のコンテキストから推測されます(マッピング関数は入力バッファーをループして各ステップの各光線に最も近い数値を見つけるため、各SDFが呼び出されたときにループカウンターの値を安全に処理できますその関数の図形IDとして)、距離の値は任意のコアSDF(たとえば、point - figure.pos
球の場合)、および色は、フィギュアバッファー内の適切な要素の平均色から定義される(そのため、フィギュアIDを保持しておくと便利です)、または保存された平均に向かって重み付けされた手続き型カラー(1つの例では、 Mandelbulbのあるポイントの反復カウント。「平均色」をFPカラースペースから整数カラースペースにマッピングし、マッピングされたカラーを反復カウントに対してXORしてパレットとして使用します)。
プロシージャルテクスチャは別のアプローチですが、私はそれらを自分で使用したことがありません。iqはその領域でかなり多くの研究を行い、いくつかの興味深いデモンストレーションをShadertoyに投稿しているため、追加の情報を収集する1つの方法になる可能性があります。
各図の色が静的であるか、手順で生成されるか、または手順テクスチャから魔法のようにサンプリングされるかに関係なく、基本的なロジックは同じです:ある種の中間の複雑なタイプ(構造体など)に図を抽象化し、ローカル距離とローカルの両方を保存しますその型のインスタンスの色を指定し、距離関数からの戻り値として複合型を渡します。実装に応じて、出力カラーは画面に直接通過するか、コリジョンポイントに従ってライティングコードに進むことができます。
上記が十分に明確であったかどうかはわかりませんので、何か意味のないことを尋ねる心配はありません。HLSLを使用してシェーディングを計算しているので、GLSL /ピクセルシェーディングコードのサンプルを実際に提供することはできませんが、最初に適切に記述しなかったものはすべて試してみて満足しています:)。