開放より2段絞ったところ

徒然なるままに…主にカメラの事を書いていくことになるかと。

#1:C言語でレイトレーシングを実装する 「事前準備」

はじめに

こんにちは壁紙です.

ホントに書きたいことができるまではブログをほとんど書かない怠け者の性分なので 最後の更新がいつかも覚えていないくらい久しぶりのブログ更新となりました.

今回はシリーズ記事ということで,C言語プログラミングについて扱っていきます.

C言語といえば現在の多くのプログラミング言語の源流ともいえるような言語で, 初心者にオススメされることも多いプログラミング言語ではあるのですが, 手続き型言語(=非・オブジェクト指向言語)であることやライブラリが少ないことから その先に繋がりにくいことがネックである言語であります.

私自身C言語を最初に学習したのは何年も前のことだったのですがそこから進展がなく, GUI開発でC#を体験したりもしてきましたがこの度大学の課題でレイトレーシングを実装してみたので その過程を後日談として記録してみたいと思い立ったのが今回のシリーズ起稿のきっかけです.

私も所詮は「苦しんで覚えるC言語」を数周した程度の初心者であることを念頭に置いていただいて, 温かい目で見守っていただければと思います.

対象としている読者

  • 「苦しんで覚えるC言語」履修済みの人
  • 高校数学(ベクトル計算)を履修済みの人(大学の線形代数学も知っているとなおヨシ)

本シリーズではベクトル演算を多様します.その中で外積の計算を行いますが,計算方法自体は知らなくても大丈夫です.他にも大学数学を多少導入するかも知れませんが,それについても知識はなくても大丈夫ですが,あったほうが理解はしやすいと思います.

想定している環境

ソフトウェア環境

ImageMagickは画像ファイル変換に使います.PPMファイルからGIFやPNGへ変換できるものならなんでも大丈夫です.

同様にテキストエディタIDEをお使いの方はVS Code以外でも大丈夫です

レイトレーシングとは

ゲームで遊ばれる方なら「レイトレーシング」とか「レイトレ」という言葉には聴き馴染みがあるのではないかと思います. レイトレーシングとは3Dグラフィックにおけるレンダリング手法の一つです. レンダリングというのは簡単に言えば,物体を画像に描き出す操作のことです. フィルムカメラでフィルムに風景を焼き付けるのと大体同じと思っていただければ大丈夫かと思います.

レイトレーシングにおけるキーワードは「スクリーン」「視点」です. まずは次の画像をご覧ください. これは簡単なレイトレの概念を図に表したものです. 三次元空間上にスクリーン,視点,そして描写したい物体(この場合球)があり, スクリーン上の画素から視点に向かって光線が伸びて行き,物体と交差する様子を描いています. この手法は現実世界でのモノが見えるしくみに準拠しているので,他のレンダリング手法に比べて「屈折」や「映り込み」を上手に表現できるのが特徴です.

f:id:kabegamikamio:20210220184902p:plain
レイトレーシングの概観

モノが目に見えるしくみをご存知の方なら少し違和感を持たれるかもしれませんが, このモデルでは「光源から出た光」を追跡するのではなく, 変な言い方になりますが「目から出た光」を追跡しています. なぜこのようなヘンなことをするのかというと, 光源から出た光は目に見えるとは限らないからです.

例えば自分より後ろにも光源からの光は届きますが, その光は目には見えていないので描写するだけムダになってしまいます. そこで目に見えている範囲だけを描写したいので目から光を出す形を取るのです.

さてレイトレのメリットとしてかなりリアルな画像を生成できるというものがあるのですが,他のレンダリング技法と比べてレンダリングに時間がかかるというデメリットもあります. それ故つい最近までは映画など事前にレンダリングした映像を流す「プリレンダ」がメインで,ゲームなどのリアルタイムでレンダリングを行う3Dグラフィクスではレイトレーシングは用いられてきませんでした. ここ数年ではGPUの飛躍的進化に伴いリアルタイムレイトレーシングが可能となり,ゲームでもレイトレ対応しているものが普及し始めました.

今回作成するプログラムではこのレイトレの実装がひとつ山場になりますが,実はこれだけでは立体的な絵を描画することはできません. なぜならこのモデルは「視線が物体と交わるかどうか」しかわからないため,交わったところが「どんな色か」までは分からないのです. つまり交点があった時は,どんな色でピクセルを塗ればいいのか教えてくれる別のモデルを用意する必要があります.

光学モデルとして今回は「フォンの反射モデル」というものを導入しますが,詳しい説明はまた後程行うことにします.

さて今回は事前準備ということで,レイトレの概要を説明しました. 次回からはいよいよ実装に入ります. 最初はベクトル演算を行う関数を実装していくことにします. それではまた次回…