24

D で比較的単純なレイトレーサー/パス トレーサーを作成しています ( http://dsource.org/projects/stacy ) が、完全に最適化しても、レイごとに数千のプロセッサ サイクルが必要です。それをスピードアップするために他にできることはありますか?より一般的に言えば、レイ トレーシングの優れた最適化/より高速なアプローチを知っていますか?

編集:これは私がすでにやっていることです。

  • コードはすでに高度に並列に実行されています
  • 一時データはキャッシュ効率の高い方法で構造化され、16b に整列されます
  • 32x32 タイルに分割された画面
  • 宛先配列は、タイル内の後続のすべてのピクセルがメモリ内で連続するように配置されます
  • 基本的なシーン グラフの最適化が実行されます
    • オブジェクトの一般的な組み合わせ (ボックス内のプレーン-プレーン CSG) は、事前に最適化されたオブジェクトに置き換えられます
  • GDC の自動ベクトル化サポートを利用できるベクトル構造体
  • 光線の後続のヒットは、遅延評価によって検出されます。これにより、CSG の不要な計算が防止されます
  • 三角形はサポートされておらず、優先度もありません。プレーン プリミティブのみ、および CSG 操作と基本的なマテリアル プロパティ
  • バウンディングがサポートされています
4

9 に答える 9

11

レイトレーサー速度の典型的な一次改善は、ある種の空間分割スキームです。プロジェクトの概要ページだけに基づくと、これを行っていないようです。

おそらく最も一般的なアプローチは octree ですが、最良のアプローチは複数の方法を組み合わせたものかもしれません (たとえば、空間分割ツリーやメールボックスなど)。バウンディング ボックス/球体テストは安っぽくて厄介な方法ですが、次の 2 つの点に注意する必要があります。 (そして負けるかもしれません)。(octree よりも) より簡単に空間分割用の規則的なグリッドを実装できますが、(表面の位置に関して) ある程度均一に分布しているシーンでのみうまく機能します。

多くは、表現するオブジェクトの複雑さ、内部設計 (つまり、ローカル変換、オブジェクトの参照コピー、暗黙的なサーフェスなどを許可するか)、およびどれだけ正確にしようとしているかに依存します。インプリシット サーフェスを使用してグローバル イルミネーション アルゴリズムを作成している場合、メッシュ オブジェクトなどの基本的なレイトレーサーを作成している場合とはトレードオフが少し異なる場合があります。私はあなたのデザインを詳細に見ていないので、あなたがすでに考えている上記の内容があったとしてもわかりません.

他のパフォーマンス最適化プロセスと同様に、最初に測定して実際に時間を費やしている場所を見つけ、次に改善する必要があります (好みによってアルゴリズム的に、次に必要に応じてコードをバミングします)。

于 2009-04-22T16:10:22.270 に答える
9

レイトレーサーで学んだことの1つは、古いルールの多くが適用されなくなったことです。たとえば、多くのレイトレーシングアルゴリズムは、計算コストの高い計算を「早期に」実行するために多くのテストを実行します。場合によっては、余分なテストを排除し、常に計算を最後まで実行する方がはるかに優れていることがわかりました。最新のマシンでは算術演算は高速ですが、分岐予測を見逃すとコストがかかります。最小限の条件分岐で書き直すことで、レイポリゴン交差テストで30%のスピードアップのようなものが得られました。

時々、最良のアプローチは直感に反することです。たとえば、いくつかの大きなオブジェクトを含む多くのシーンは、それらを多数の小さなオブジェクトに分割すると、はるかに高速に実行されることがわかりました。シーンのジオメトリによっては、これにより、空間細分割アルゴリズムが多くの交差テストをスローできるようになります。それに直面しましょう。交差点テストは非常に高速にしか実行できません。大幅なスピードアップを得るには、それらを排除する必要があります。

階層的なバウンディングボリュームは大いに役立ちますが、私はついにkdツリーを調べて、速度を大幅に向上させました。もちろん、ツリーの構築にはコストがかかるため、リアルタイムのアニメーションには法外なコストがかかる可能性があります。

同期のボトルネックに注意してください。

適切な場所に注意を向けるために、プロファイルを作成する必要があります。

于 2009-05-26T23:29:18.647 に答える
6

それをスピードアップするために他にできることはありますか?

D は、実装とコンパイラにもよりますが、適度に優れたパフォーマンスを発揮します。どのようなレイ トレーシング方法と最適化を既に使用しているかを説明していないので、私はそこに多くの助けを与えることはできません.

次のステップは、プログラムでタイミング解析を実行し、最も頻繁に使用されるコード、またはアセンブリでパフォーマンスに最も影響を与えるよりも最も遅いコードを再コーディングすることです。

より一般的には、次の質問のリソースを確認してください。

グラフィック カード (超並列コンピューター) を使用して一部の作業を行うというアイデアがとても気に入っています。

このサイトには他にも多くのレイトレーシング関連のリソースがあり、その一部はこの質問のサイドバーにリストされており、そのほとんどはレイトレーシング タグにあります。

于 2009-04-22T16:12:22.577 に答える
3

いくつかの提案。

  • バウンディングオブジェクトを使用して、すばやく失敗します。
  • (一般的なグラフィックカードのように)最初のステップでシーンを投影し、ライトの計算にのみレイトレーシングを使用します。
  • コードを並列化します。
于 2009-04-22T16:15:18.657 に答える
3

私は D をまったく知らないので、コードを見て特定の最適化を見つけることはできませんが、一般的に話すことはできます。

それは本当にあなたの要件に依存します。最も単純な最適化の 1 つは、特定の光線がたどることができる反射/屈折の数を減らすことですが、そうすると「完璧な結果」を失い始めます。

レイトレーシングは「恥ずかしいほど並列」の問題でもあるため、リソース (マルチコア プロセッサなど) がある場合は、複数のピクセルを並列に計算することを検討できます。

それを超えると、プロファイルを作成して正確に何がそんなに時間がかかっているのかを把握し、それを最適化する必要があります。交差点検出ですか?次に、そのコードの最適化などに取り組みます。

于 2009-04-22T16:11:46.900 に答える
3

1 つおきのピクセルをレイトレースします。補間によって中間の色を取得します。色が大きく異なる場合 (オブジェクトの端にいる場合)、その間のピクセルをレイトレースします。不正行為ですが、単純なシーンでは、画質をいくらか犠牲にしながら、パフォーマンスをほぼ 2 倍にすることができます。

GPU でシーンをレンダリングしてから、再度ロードします。これにより、GPU 速度で最初のレイ/シーン ヒットが得られます。シーン内に多くの反射面がない場合、これによりほとんどの作業が単純な古いレンダリングに削減されます。GPU での CSG のレンダリングは、残念ながら完全に単純ではありません。

PovRay のソース コードを読んでインスピレーションを得てください。:)

于 2010-07-22T03:56:18.590 に答える
2

最初に、非常に高速なアルゴリズムを使用していることを確認する必要があります (それらを実装するのは本当に面倒ですが、何をしたいのか、どこまで行きたいのか、どれだけ高速であるべきか、それは一種のトレードオフです)。

私からのいくつかのヒント-メールボックス技術を使用しないでください.論文では、カウントオーバーヘッドのために実際のアーキテクチャでうまくスケーリングできないことが時々議論されています-BSP/Octtreesを使用しないでください.それらは比較的遅い. -レイトレーシングにGPUを使用しないでください。反射や影、屈折、フォトンマッピングなどの高度な効果には遅すぎます(シェーディングにのみ使用しますが、これは私のビールです)

完全な静的シーンの場合、kd-Tree は無敵であり、動的シーンの場合、クアッドコアで非常にうまくスケーリングする巧妙なアルゴリズムがあります (上記のパフォーマンスについてはわかりません)。

そしてもちろん、本当に良いパフォーマンスを得るには、非常に多くの SSE コードを使用する必要があります (もちろん、ジャンプはあまり多くありません)。 SSEのものを実装します。

そして、私が話していたいくつかのアルゴリズムに関するいくつかのまともな論文:

「Fast Ray/Axis-Aligned Bounding Box - Ray Slopes を使用したオーバーラップ テスト」(非常に高速で非常に優れた並列化可能 (SSE) AABB-Ray ヒット テスト)(注: 論文のコードはすべてのコードではありません。紙、あなたはそれを見つけるでしょう)

http://graphics.tu-bs.de/publications/Eisemann07RS.pdf

「ダイナミック バウンディング ボリューム階層を使用した変形可能なシーンのレイ トレーシング」

http://www.sci.utah.edu/~wald/Publications/2007///BVH/download//togbvh.pdf

上記のアルゴリズムがどのように機能するかを知っている場合、これははるかに優れたアルゴリズムです。

「動的シーンにおける高速レイ トレーシングのための事前計算された三角形クラスターの使用」

http://garanzha.com/Documents/UPTC-ART-DS-8-600dpi.pdf

また、pluecker-test を使用して、ポリゴンにヒットしたかどうかを高速に判断しています (それほど正確ではありませんが、すべてを取得することはできません)。SSE 以上で非常にうまく機能します。

つまり、私の結論は、レイトレーシングに関連する非常に多くのトピック (高速で効率的なツリーの構築方法とシェーディングの方法 (BRDF モデル) など) について、非常に多くの優れた論文が世の中にあるということです。 「実験」という驚くほど興味深い分野ですが、非常に複雑ですが面白いので、十分な時間も必要です。

于 2010-07-17T22:09:00.013 に答える
0

私の最初の質問は、1 つの静止画面のトレースを最適化しようとしているのか、それともアニメーションを計算するために複数の画面のトレースを最適化しようとしているのかということです。

1 つのショットの最適化は 1 つのことですが、アニメーションの連続するフレームを計算する場合は、考えたり最適化したりする新しいことがたくさんあります。

于 2009-05-21T00:45:47.497 に答える
0

あなたは出来る

  • SAH に最適化されたバウンディング ボリューム階層を使用します...
  • ...最終的にはパケットトラバーサルを使用し、
  • 重要度サンプリングを導入し、
  • モートン コードで並べ替えられたタイルにアクセスして、キャッシュの一貫性を向上させます。

まだまだありますが、これらは私がすぐに思いつく提案でした。もっと言えば:

ジオメトリが交差するときに候補ノードをすばやく特定するために、統計に基づいて最適化された階層を構築できます。あなたの場合、自動階層をモデリング階層と組み合わせる必要があります。つまり、ビルドを制約するか、最終的にモデリング情報を複製します。

「パケット トラバーサル」とは、SIMD 命令を使用して 4 つの並列スカラーを計算することを意味します。それぞれのレイは、ハードウェアから最大限のパフォーマンスを引き出すために、階層 (通常はホット スポット) をトラバースするためのものです。

結果のピクセル カラーへの寄与に基づいてサンプリング レート (2 次レイ ショットの数) を制御するために、いくつかのレイごとの統計を実行できます。

タイルで面積曲線を使用すると、ピクセル間の平均空間距離を減らすことができるため、キャッシュ ヒットによってパフォーマンスが向上する可能性が低くなります。

于 2012-09-04T16:38:40.857 に答える