Апроксимация Ambient Occlusion для расчета вторичной освещенности
Считать интеграл освещенности точно – довольно дорого. Однако, существует ряд аппроксимаций, позволяющих примерно оценить его значение, не выполняя трассировку лучей по всем направлениям. Во-первых, следует разделить непрямое освещение на “резкоменяющееся” и “плавноменяющееся” – соответственно высокочастотную компоненту и низкочастотную компоненты. Высокочастотную составляющую считают, как и раньше, трассировкой лучей. Однако, для нее количество лучей обычно небольшое (если только не рассматриваются мягкие тени и glossy reflections). Например, вам нужен всего 1 отраженный луч чтобы посчитать отражения на поверхности.
Для низкочастотной компоненты, обуславливающей диффузные переотражения света (которую дольше всего считать), можно применить аппроксимацию, позволяющую получить очень похожий на правду, но не совсем точный результат.
Идея Ambient Occlusion похожа на трассировку лучей по всем направлениям, но более простая в вычислительном плане. Мы предполагаем что вторичный, диффузно-переотраженный свет относительно равномерно распределен в пространстве. Такое освещение можно заменить неким источником, называемым environment light. Он может быть задан панорамой, куб-мапом, или в простейшем случае просто – числом (3 числами – для красного, синего и зеленого). То есть мы говорим, пусть весь наш вторичный свет от относительно-далеко стоящих поверхностей задан некой константой g_environmentLightColor.
Рисунок 5. Ambient Occlusion algorithm
Тогда, в той точке, где мы хотим посчитать освещение, мы испускаем лучи по всем направлениям, но не трассируем их в сцену, а лишь пытаемся вычислить, какой процент нашего environment light закрыт близлежащими поверхностями.
Рисунок 6. Честно посчитанный Ambient Occlusion.
То есть, фактически мы просто ограничили длину трассировки луча. Однако, во многих случаях Ambient occlusion можно вычислить, не прибегая к трассировке лучей, заменив ее более простой апроксимацией, ведь нам не нужно в действительности находить пересечения, необходимо лишь знать - какой процент (примерно) нашего воображаемого источника закрыт.
Упрощение для неявно заданных поверхностей
В случае неявно задаваемых поверхностей, существует упрощение, довольно точно приближающее честный Ambient Occlusion. Идея состоит в том, чтобы взять несколько точек в направлении нормали к поверхности (5-10).
Рисунок 7. Поверхность, в точках которой мы хотим вычислить Ambient Occlusion.
И посмотрев в них расстояние до поверхности, оценить, насколько эта точка закрыта близлежащей геометрией. Это как раз наш случай, потому что у нас есть такая функция – это просто левая часть уравнения поверхности f(x,y,z) = 0. То есть это знакомая (по статье про неявно заданные поверхности) нам функция f(p).
Рисунок 8. Желтые линии показываеют приблизительное расстояние до близлежащей геометриии. Чем оно меньше, тем больше синяя точка закрыта от внешнего освещения.
Ambient Occlusion рассчитанный таким способом, оказывается дешевле чем трассировка первичного луча!
Рисунок 9. Ambient occlusion на фрактальной поверхности. Если его выключить, поверхность станет просто однотонно-белой.
|