3Dシーン用のC ++でライトシミュレーターを作成しています(今のところ「コーネルボックス」)。これは私が行っているグラフィック コースのプロジェクトであり、高速化を目指しているわけではありません。適切な画像を 1 つレンダリングするだけで十分です。たとえ数時間かかっても問題ありません。グローバル イルミネーションと DOF をデモしたいと思います。
通常のレイトレーサーの代わりに、光線は点光源から放出され、シーン内のジオメトリで跳ね返り、最終的に光センサー (3D 環境では長方形) に当たります。光線がセンサーに当たる場所に応じて、画面上のそのピクセルの強度が増加します。
センサーとシーンの間には、カメラをシミュレートするために適切に設計および配置しようとしているレンズがあります。レンズも平面ですが、法線 (光線がレンズに当たり、屈折するとき) は、薄い球面レンズに従って計算されます。
ウィキペディアで見つけたレンズなどの式から派生した私の現在のセットアップ:
The Cornell box: x, y and z in between -1 and 1
Sensor dimensions: 0.2 x 0.2 (too large?)
Sensor position: 0, 0, -2.9
Sensor resolution: ~ 150 x 150 px
Lens dimensions: 0.4 x 0.4 (rectangular shape for now, spherical normals)
Lens position: sensor position + (0, 0, 0.1037) (in front of sensor)
Lens IOR: 1.52 (glass)
Lens focal length: 0.1
Lens radius: 0.104
見えるのは主に点光源で、焦点が合っていません。
理想的には、DOF が見えるように、ボックスの約半分 (z が -.5 から .5 の間) に焦点を合わせる必要があります。私の質問は、センサーとレンズを調整して画像を表示するにはどうすればよいですか? レンズとセンサーを小さくしすぎると、ほとんどすべての光線が破棄されてカメラに当たらず、レンダリングが計算的に実行不可能になるとは思えません。