web-dev-qa-db-ja.com

最新のOpenGLでレイトレーシングを行う方法は?

それで、私は自分の平らな色のモデルの照明を開始する必要があります。テストアプリケーションは最新のメソッドのみを実装するためのテストケースであるため、理想的にはレイトレーシングを実装する必要があることに気付きました(理論的には、数年後のリアルタイムグラフィックスには理想的である可能性があるため)。

しかし、どこから始めればよいでしょうか。

古いOpenGLでライティングを一度も行ったことがないので、非推奨ではないメソッドに直接進みます。

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

平らな色の頂点から、GLSLを介して適切な最終結果を得るのに必要なすべてのものに至る情報源はありますか?理想的には、それを補完するために必要となる可能性のある他の追加の照明方法を使用します。

30
j riv

OpenGLで実際のレイトレーシングを試すことはお勧めしません。そのためには多くのハックやトリックが必要であり、私に尋ねても、これを行う意味はもうありません。 GPUでレイトレーシングを行う場合は、CUDAやOpenCLなどのGPGPU言語を使用することをお勧めします。

問題をもう少し詳しく説明します。レイトレーシングでは、2次光線をトレースし、ジオメトリとの交差をテストする必要があります。したがって、シェーダー内で何らかの巧妙な方法でジオメトリにアクセスする必要がありますが、フラグメントシェーダー内では、「コード化」してテクスチャに格納しないと、ジオメトリにアクセスできません。頂点シェーダーもこのジオメトリ情報をネイティブに提供せず、ジオメトリシェーダーは隣接するジオメトリのみを認識しているため、ここですでに問題が発生しています。次に、適切なフレームレートを取得するには、加速データ構造が必要です。ただし、たとえばシェーダー内のKdツリーは非常に難しく、私が正しく思い出せば、この問題のみに関するいくつかの論文があります。本当にこのルートに行きたいのであれば、このトピックに関する多くの論文があるので、それらを見つけるのはそれほど難しくないはずです。

レイトレーサーは、優れたパフォーマンスを実現するために、非常に適切に設計されたアクセスパターンとキャッシュを必要とします。ただし、GLSL内でこれらを制御することはほとんどなく、パフォーマンスの最適化は非常に困難になる可能性があります。

もう1つの注意点は、少なくとも私の知る限りでは、GPUでのリアルタイムレイトレーシングはほとんどが静的シーンに限定されていることです。 kd-treeは、静的なシーンでのみ(うまく)機能します。動的なシーンが必要な場合は、他のデータ構造(BVH、iircなど)が必要ですが、常にそれらを維持する必要があります。何も見逃していないのであれば、この問題については現在も多くの調査が行われています。

28
zerm

あなたはいくつかのことを混乱させるかもしれません。

OpenGLはラスタライザです。レイトレーシングを強制することは可能ですが、困難です。これが、レイトレーシングが「数年後のリアルタイムグラフィックスにとって理想的」ではない理由です。数年後には、ハイブリッドシステムのみが実行可能になります。

したがって、3つの可能性があります。

  • 純粋なレイトレーシング。フルスクリーンクワッドのみをレンダリングし、フラグメントシェーダーで、バッファーにパックされたシーンの説明(テクスチャなど)を読み取り、階層をトラバースし、レイとトライアングルの交差を計算します。
  • ハイブリッドレイトレーシング。シーンを通常の方法でラスタライズし、実際にそれを必要とするシーンの一部の部分でシェーダーでレイトレーシングを使用します(屈折、...ラスタライズでシミュレートできます)
  • 純粋なラスタライズ。フラグメントシェーダーは通常の仕事をします。

正確に何を達成したいですか?必要に応じて、回答を改善することができます。

とにかく、 this SO question は関連性が高いです。この特定の実装にバグがあったとしても、それは間違いなく進むべき道です。別の可能性はopenCLですが、コンセプトは同じ。

21
Calvin1602

2019と同様に、レイトレーシングはリアルタイムレンダリングのオプションですが、ほとんどのユーザーにはないハイエンドGPUが必要です。これらのGPUの一部は、レイトレーシング専用に設計されています。 OpenGLは現在、ハードウェアによるレイトレーシングをサポートしていません。 WindowsのDirectX 12はサポートしています。現在のデスクトップおよびラップトップハードウェアでDirectX 12を使用することは可能ですが、レイトレーシングのみのレンダラーを作成する前に、さらに数年待つことをお勧めします。モバイルからのサポートには数十年かかる場合があります。私はopenGLがレイトレーシングをサポートしているのを見ていませんが、vulkanが将来サポートする可能性があります。

0
tomer zeitune