[解決済み] 最新のOpenGLでレイトレーシングを行うには?
質問
そこで、平板な色のモデルに照明を当て始めなければならない段階になっています。テストアプリケーションは最新のメソッドだけを実装したテストケースなので、理想はレイトレーシングを実装することだと気づきました(理論的には数年後のリアルタイムグラフィックスに最適かもしれないからです)。
でも、どこから手をつければいいんだろう?
古いOpenGLでライティングをしたことがないと仮定すると、非推奨のメソッドに直接行くことになります。
このアプリケーションは現在、頂点バッファオブジェクト、頂点、法線、カラー入力を適切に設定しており、空間内のモデルをフラットカラーで正しく描画、変形しています。
フラットな色の頂点から、GLSLを介して適切な最終結果を得るために必要なすべてのことを行うような情報源はありますか?理想的には、それを補完するために必要と思われる他の追加的なライティング手法も一緒にお願いします。
どのように解決するのですか?
OpenGLで実際にレイトレーシングをするのはお勧めしません。そのためには多くのハックとトリックが必要で、私に言わせれば、もうこれをする意味は全くありません。 もし、GPU上でレイトレーシングをしたいのであれば、CUDAやOpenCLなどのGPGPU言語を使うべきでしょう。
もう少し問題を説明すると レイトレーシングでは、二次光線をトレースし、ジオメトリと交差するかどうかをテストする必要があります。したがって、シェーダ内で何らかの巧妙な方法でジオメトリにアクセスする必要がありますが、フラグメントシェーダ内では、ジオメトリを何らかのテクスチャに "coded"%格納しなければ、ジオメトリにアクセスできません。バーテックスシェーダもこのジオメトリ情報をネイティブに提供しませんし、ジオメトリシェーダは近傍しか知らないので、ここですでに問題が始まっているのです。 次に、妥当なフレームレートを得るためには、アクセラレーションデータ構造が必要です。しかし、シェーダ内のKd-Treeなどをトラバースするのは非常に難しく、私の記憶が正しければ、この問題だけに関する論文がいくつかあります。 もし、あなたが本当にこのルートを進みたいのであれば、このトピックに関する多くの論文があり、それらを見つけるのはそれほど難しくないはずですが。
レイトレーサーは、良いパフォーマンスに到達するために、非常によく設計されたアクセスパターンとキャッシュを必要とします。しかし、GLSL内部ではこれらをほとんど制御することができず、パフォーマンスを最適化するのは本当に大変なことです。
もうひとつのポイントは、少なくとも私の知る限り、GPUでのリアルタイムレイトレーシングは、ほとんどが静的なシーンに限定されていることです。動的なシーンを作成したい場合は、他のデータ構造(例えば、BVHなど)が必要ですが、常にそれらを維持する必要があります。もし私が何も見逃していなければ、この問題に関しては現在も多くの研究が行われています。
関連
-
[解決済み] テスト
-
[解決済み] FreeGLUTとGLFWの違いは何ですか?[クローズド]
-
[解決済み] glReadPixelsはどのように動作するのですか?
-
[解決済み] Emscripten/OpenGLのコードで「glDrawArrays: attribute 1の範囲外の頂点にアクセスしようとする」(ネイティブC++では動作する) [終了しました]
-
[解決済み] OpenGL - GLenumはどのように符号なし32ビット整数ですか?
-
[解決済み] Ken Silverman氏のVoxlapエンジンで使用されているアルゴリズムについて、どなたか教えてください。
-
[解決済み] OpenGL - glDepthMaskの使い方についての質問です。
-
[解決済み] FOVXの計算(openGL)
-
[解決済み] OpenGLのフレームバッファとレンダーバッファの概念と違いについて教えてください。
-
[解決済み] バーテックスシェーダとフラグメントシェーダの比較 [重複].
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] X リクエストが失敗したときのエラー。BadValue (整数パラメータが操作の範囲外です)
-
[解決済み] OpenGL - なぜ、インデックスのためのGL_ELEMENT_ARRAY_BUFFERなのですか?
-
[解決済み] OpenGL - GLenumはどのように符号なし32ビット整数ですか?
-
[解決済み] 最新のOpenGLで複数のテクスチャをレンダリングするには?
-
[解決済み] glutSpecialFuncを正しく使うには?
-
[解決済み] glDeleteBuffers()はいつ呼び出すべきですか?
-
opengl glGetIntegerv エラーを使用します。アクセス違反 ロケーション0x0000000000000000を実行中
-
[解決済み] gluPerspectiveパラメータ - その意味するところは?
-
[解決済み] 最新のOpenGLでレイトレーシングを行うには?
-
[解決済み】GLSLシェーダをデバッグする方法は?