Я создаю симулятор света на C++ для 3D-сцены (пока "Корнеллский ящик"). Это проект для курса по графике, который я делаю, и я не стремлюсь сделать его быстро, меня вполне устраивает просто визуализировать одно приличное изображение, даже если это займет несколько часов. Я хочу продемонстрировать глобальное освещение и глубину резкости.
Вместо обычного трассировщика лучей лучи испускаются точечным источником света, отражаются от геометрии в сцене и в конечном итоге попадают на датчик света, который представляет собой прямоугольник в 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
Виден в основном точечный источник света, несфокусированный.
В идеале я хочу, чтобы примерно половина поля (z между -0,5 и 0,5) была сфокусирована, чтобы можно было увидеть DOF. Мой вопрос: как откалибровать сенсор и линзу, чтобы появилось изображение? Я не думаю, что смогу сделать линзу и сенсор слишком маленькими, тогда почти все лучи будут отброшены, потому что они не попадет в камеру и, таким образом, сделает рендеринг невыполнимым с вычислительной точки зрения.