レイトレーシング

2024年8月29日 (木) 01:47時点におけるAdministrator (トーク | 投稿記録)による版 (→‎影にノイズが出やすい)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

レイトレーシング英語:raytracing)とは、3DCGを描画するアルゴリズムのひとつである。

概要 編集

現実の世界では太陽などの光源から光が出て、その光が物体に当たることで反射を繰り返し、最終的に人間の目に入った場合に物体が見える。

一方、レイトレーシングではそれとは逆に目から視線が出て、その視線が物体に当たることで反射を繰り返し、最終的に光源に到達した場合に、光の強さを計算して色を算出し物体を描くというものである。ようするに現実の世界とは逆方向に光をシュミレーションしているのである。

大雑把にいえばレイトレーシングはレイキャスティングボリュームレイキャスティング)の発展系であり、レイキャスティングでは最短で最速でまっすぐに一直線に接触があれば単純に色を拾うというものであったが、レイトレーシングでは物体と接触した際に「反射」の処理が入り、さらに光源に到達するまでの距離なども考慮される。

 


長所 編集

シンプル 編集

レイトレーシングはレイキャスティングに「反射」の概念を入れただけの非常にシンプルなアルゴリズムである。反射や透過、屈折、影の効果などをシンプルなアルゴリズムで実装できる。

短所 編集

計算量が桁違いに多い 編集

レイトレーシングはレイキャスティングに「反射」の概念を入れただけの非常にシンプルなアルゴリズムである。「レイトレーシングは重い」というイメージがあるが、その根底にあるレイキャスティング自体は非常に軽いものである。

1回の処理こそ軽いわけだが、そこに「反射」の処理を入れるとレイキャスティングの回数が反射する回数だけ増えることになる。つまりやっていること自体はシンプルだが強烈な回数のループ処理になる。レイトレーシングでそこそこ綺麗な画像を得ようとした場合、最低でも画像(画面)の解像度と同じだけの数のレイを飛ばさなければならない。

たとえば画面の解像度フルHD(1920x1080)であれば約200万画素ピクセル)ものレイを投げることになる。この各レイが平均5回ほど反射するとしたら1000万レイになる。これをリアルタイムレンダリングで秒間60フレームを出そうと思ったら1秒間に6億回もレイを飛ばさなければならない。さすがに1回の計算量が少なくてもこれだけあると重くなる。C言語で単純にforループを空回しただけでも重たいね。

影にノイズが出やすい 編集

出力画像の解像度とレイの数が同程度の場合に影にノイズが出やすいという特徴がある。

ノイズを低減するにはスーパーサンプリングを行う必要がある。 手っ取り早いのが「1ピクセルを作るのに微妙に角度を変えた複数のレイを飛ばしてその平均値を取る」という方法だ。 ただこの方法はレイの数が飛躍的に増える諸刃の剣だ。

アルゴリズム 編集

そのうち書く

関連項目 編集

1D
2D
3D