GPUパストレース、パート1

鉄とレンダリング

現在最も一般的なプロセッサアーキテクチャはx86-64です。 これらはCISCに分類されます。 それらにはコマンドの巨大なセットがあり、それがチップ上のコアの広い領域につながった。 これは、チップ上にいくつかのコアを実装するのに困難を伴いました。 X86プロセッサは、複数の小さな命令セット(RISC)の実行が必要なマルチスレッドコンピューティングには理想的ではありません。

レンダリングは、ほぼ無制限の数のコアに完全に並列化できるアルゴリズムです。



偏りのないレンダリング

鉄の生産性が着実に成長しているという事実を考慮すると、技術的な問題(たとえば、V線での材料の反射のサンプリング、アンチエイリアシングのバイアスの量、モーションブラー、被写界深度、ソフトシャドウ)が鉄の肩にますますシフトしています。 そのため、数年前、最初の商用の不偏レンダリングが登場しました-Maxwell Render。

その主な利点は、最終的な画像の品質、最小限の設定、あらゆる種類の「バイアス」でした。 時間が経つにつれて、画質は「理想」に近づきます。 そして、欠点はありました-レンダリング時間。 騒音が鳴るまで待つのに非常に長い時間がかかり、多くの人が数回の試行の後すぐにそれを拒否しました。 状況はアニメーションでさらに悪化しました(理由は明らかです)。



画像



アルゴリズム

1.ビーム(画面上の特定のピクセルに対応する開始点)がカ​​メラから解放されます。

2.ジオメトリ要素の1つがビームを横切ったかどうかを確認します。 そうでない場合は、手順1に進みます。

3.ビームとカメラに最も近いジオメトリの交点を決定します。

4.交差点から光源に向かって新しいビームを放します。

5.交差点と光源の間のビームに障害物がある場合、ステップ7に進みます。

6.ピクセルを色で塗りつぶします(単純化、特定のポイントでの表面の色に、ビームとの接触ポイントでの光源の強度を掛けたもの)

7.交点から任意の方向に新しい光線を放し、反射の最大数に達するまで手順2に進みます(ほとんどの場合4〜8、シーンに多くの反射または屈折がある場合、この数を増やす必要があります)。



画像

「ノイズの多い」画像の例。



優れた品質を達成するためのピクセルあたりのサンプル数は、数千単位で測定できます。 たとえば、10,000(シーンに応じて)

画像あたりの光線の数FullHD 2mpix * 10,000-200億。

パストレースの最適化にはいくつかのタイプがあります。双方向パストレース、メトロポリスライトトランスポート、エネルギー再配布パストレース。光線を「必要な場合」にできるように設計されています。 CPUでのほとんどのレンダリングは、この目的のためにMLTアルゴリズム(Maxwell、Fry、Lux)を使用します。



GPUの役割

このアルゴリズムは浮動小数点演算を再利用し、このアルゴリズムにはマルチスレッドが不可欠です。 したがって、このタスクは徐々にGPU自体に受け入れられます。

既存のテクノロジー:CUDA、FireStream、OpenCL、DirectCompute、およびシェーダー上で直接プログラムを作成することもできます。



画像



状況は次のとおりです。

CUDA-全員に書き込み、さまざまなもの(iRay、Octane Render、Arion Render、Cyclesなど)。

FireStream-何も表示されません。

OpenCL-SmallLuxGPU、サイクル、Indigo Render。 誰も真剣に受け止めていないようです。

DirectCompute-何も表示されません。

シェーダーはほんの一例です。 シェーダーでのパストレースの WebGL実装。



レンダリングの比較はパート2で行われます。



All Articles