1. ホーム
  2. opengl

[解決済み] 最新のOpenGLでレイトレーシングを行うには?

2022-03-07 05:52:26

質問

そこで、平板な色のモデルに照明を当て始めなければならない段階になっています。テストアプリケーションは最新のメソッドだけを実装したテストケースなので、理想はレイトレーシングを実装することだと気づきました(理論的には数年後のリアルタイムグラフィックスに最適かもしれないからです)。

でも、どこから手をつければいいんだろう?

古いOpenGLでライティングをしたことがないと仮定すると、非推奨のメソッドに直接行くことになります。

このアプリケーションは現在、頂点バッファオブジェクト、頂点、法線、カラー入力を適切に設定しており、空間内のモデルをフラットカラーで正しく描画、変形しています。

フラットな色の頂点から、GLSLを介して適切な最終結果を得るために必要なすべてのことを行うような情報源はありますか?理想的には、それを補完するために必要と思われる他の追加的なライティング手法も一緒にお願いします。

どのように解決するのですか?

OpenGLで実際にレイトレーシングをするのはお勧めしません。そのためには多くのハックとトリックが必要で、私に言わせれば、もうこれをする意味は全くありません。 もし、GPU上でレイトレーシングをしたいのであれば、CUDAやOpenCLなどのGPGPU言語を使うべきでしょう。

もう少し問題を説明すると レイトレーシングでは、二次光線をトレースし、ジオメトリと交差するかどうかをテストする必要があります。したがって、シェーダ内で何らかの巧妙な方法でジオメトリにアクセスする必要がありますが、フラグメントシェーダ内では、ジオメトリを何らかのテクスチャに "coded"%格納しなければ、ジオメトリにアクセスできません。バーテックスシェーダもこのジオメトリ情報をネイティブに提供しませんし、ジオメトリシェーダは近傍しか知らないので、ここですでに問題が始まっているのです。 次に、妥当なフレームレートを得るためには、アクセラレーションデータ構造が必要です。しかし、シェーダ内のKd-Treeなどをトラバースするのは非常に難しく、私の記憶が正しければ、この問題だけに関する論文がいくつかあります。 もし、あなたが本当にこのルートを進みたいのであれば、このトピックに関する多くの論文があり、それらを見つけるのはそれほど難しくないはずですが。

レイトレーサーは、良いパフォーマンスに到達するために、非常によく設計されたアクセスパターンとキャッシュを必要とします。しかし、GLSL内部ではこれらをほとんど制御することができず、パフォーマンスを最適化するのは本当に大変なことです。

もうひとつのポイントは、少なくとも私の知る限り、GPUでのリアルタイムレイトレーシングは、ほとんどが静的なシーンに限定されていることです。動的なシーンを作成したい場合は、他のデータ構造(例えば、BVHなど)が必要ですが、常にそれらを維持する必要があります。もし私が何も見逃していなければ、この問題に関しては現在も多くの研究が行われています。