41. Учет прозрачности в модели освещения. Учет прозрачности в алгоритмах удаления невидимых поверхностей - p1xelse/CG GitHub Wiki

Если что, по сути - вот вся глава из роджерса http://www.mari.ru/mmlab/home/kg/Lection11/5.html

Закон Снеллиуса

В основных моделях освещения и алгоритмах удаления невидимых линий и поверхностей рассматриваются только непрозрачные поверхности и объекты. Однако существуют и прозрачные объекты, пропускающие свет, например, такие, как стакан, ваза, окно автомобиля, вода. При переходе из одной среды в другую, например из воздуха в воду, световой луч преломляется; поэтому торчащая из воды палка кажется согнутой. Преломление рассчитывается по закону Снеллиуса, который утверждает, что падающий и преломляющий лучи лежат в одной плоскости, а углы падения и преломления связаны формулой

где и - показатели преломления двух сред, - угол падения, - угол преломления

Напоминание, как выглядят преломления.

Рис. 11.15

Рис. 11.16

Так же, как и отражение, пропускание может быть зеркальным (направленным) или диффузным. Направленное пропускание свойственно прозрачным веществам, например стеклу. Если смотреть на объект сквозь такое вещество, то, за исключением контурных линий криволинейных поверхностей, искажения происходить не будет. Если свет при пропускании через вещество рассеивается, то мы имеем диффузное пропускание. Такие вещества кажутся полупрозрачными или матовыми. Если смотреть на объект сквозь такое вещество, то он будет выглядеть нечетким или искаженным

На рис. 11.15 показаны некоторые практические следствия преломления. Показатель преломления объектов 1 и 2 одинаков и больше, чем у окружающей среды. Объекты 3 и 4 непрозрачны. Если не принимать во внимание преломление, то луч a пересечется с объектом 3 (пунктирная линия). Однако из-за преломления он отклоняется и пересекается с объектом 4, т. е. объект 4 можно увидеть, только учитывая эффект преломления. Если же рассматривать луч b, то без учета преломления он пересекается с объектом 4, хотя на самом деле он пересекается с объектом 3, т. е. здесь объект, который видим, на самом деле увидеть нельзя. Все это необходимо иметь в виду при создании реалистических изображений

Нечто похожее происходит при встраивании перспективного преобразования в видовое преобразование. Обычно перспективное преобразование проводится для того, чтобы получить искаженный объект, который затем строится в аксонометрической проекции с точкой наблюдения, удаленной в бесконечность (рис. 11.17). На рис. 11.17, а луч, исходящий из точки Р, пересекает неискаженный объект в точке i и после преломления попадает в точку b плоскости фона. На рис. 11.17, b показан объект после перспективного преобразования. Теперь луч пересекает объект в преобразованной точке i', преломленный луч пересекается с фоном в точке b' с противоположной стороны от центральной линии. Это происходит из-за неправильных угловых соотношений между искаженным (преобразованным) объектом и искаженным (преломленным) лучом


В простейших реализациях эффекты прозрачности преломления вообще не рассматриваются, и явления, показанные на рис. 11.16 и 11.17, не учитываются. Кроме того, не принимается во внимание, как путь, пройденный лучом в среде, влияет на его интенсивность. Самые ранние разработки в этой области принадлежат Ньюэлу. Простое пропускание света можно встроить в любой алгоритм удаления невидимых поверхностей, кроме алгоритма с z-буфером.

Существует два варианта аппроксимации - линейная и нелинейная

Линейная

Прозрачные многоугольники или поверхности помечаются, и если видимая грань прозрачна, то в буфер кадра записывается линейная комбинация двух ближайших поверхностей. При этом интенсивность

где - видимая поверхность, - поверхность, расположенная непосредственно за ней, t - коэффициент прозрачности . Если поверхность совершенно прозрачна, то t = 0, а если непрозрачна, то t = 1. Если тоже прозрачна, то алгоритм применяется рекуррентно, пока не встретится непрозрачная поверхность или фон. Если многоугольники записываются в буфер кадра в соответствии с приоритетами глубины, как в алгоритме Ньюэла - Ньюэла - Санча, тогда будет соответствовать значению, записанному в буфер кадра, а - текущей поверхности.

Нелинейная

Для криволинейных поверхностей, например, таких, как ваза или бутылка, линейной аппроксимации недостаточно, так как вблизи контурных линий прозрачность уменьшается из-за толщины материала. Чтобы точнее изобразить это явление, Кэй предложил несложную нелинейную аппроксимацию на основе z-составляющей нормали к поверхности. В частности, коэффициент прозрачности

где tmin и tmax - минимальная и максимальная прозрачность объекта, есть z - составляющая единичной нормали к поверхности, р - коэффициент степени прозрачности, t - прозрачность пиксела или точки объекта.

Рис. 11.18.

Сравнение результатов двух моделей: линейной(слева) и нелинейной(справа)

Для того чтобы включить преломление в модель освещения, нужно при построении видимых поверхностей учитывать не только падающий, но и отраженный и пропущенный свет (рис. 11.15). Эффективнее всего это выполняется с помощью глобальной модели освещения в сочетании с алгоритмом трассировки лучей для выделения видимых поверхностей. Обычно рассматриваются только зеркально отраженные и пропущенные лучи, так как диффузное отражение от просвечивающих поверхностей порождает бесконечное количество беспорядочно ориентированных лучей. Поэтому моделируются только прозрачные вещества, для которых формула расчета интенсивности является простым расширением ранее описанных моделей. Ее общий вид:

где индексы a, d, s, t обозначают рассеянный, диффузный, зеркальный и пропущенный свет. В большинстве моделей предполагается, что - постоянная и - интенсивность преломленного света определяется по закону Снеллиуса.

Как учесть прозрачность в алгоритмах?

Простое пропускание света можно встроить в любой алгоритм удаления невидимых поверхностей, кроме алгоритма с z-буфером

Для алгоритма, использующего z-буфер, последовательность действий такова:

Для каждого многоугольника:

  • если многоугольник прозрачен, то внести его в список прозрачных многоугольников;

  • если многоугольник непрозрачен и z > zбуфер , то записать его в буфер кадра для непрозрачных многоугольников и скорректировать этот буфер.

Для каждого многоугольника из списка прозрачных многоугольников:

если z > zбуфер , то прибавить его коэффициент прозрачности к значению, содержащемуся в буфере весовых коэффициентов прозрачности;

прибавить его интенсивность к значению, содержащемуся в буфере интенсивности прозрачности, в соответствии с правилом

где - новое значение интенсивности, - старое значение интенсивности, записанное в буфере интенсивности прозрачности, - интенсивность текущего многоугольника, - старый коэффициент прозрачности из буфера весовых коэффициентов прозрачности, - коэффициент прозрачности текущего многоугольника. Таким образом, получается взвешенная сумма интенсивностей всех прозрачных многоугольников, находящихся перед ближайшим непрозрачным многоугольником.

Объединим буферы интенсивности для прозрачных и непрозрачных многоугольников в соответствии с правилом

где - окончательная интенсивность в буфере кадра для непрозрачных многоугольников, a - старое значение интенсивности в этом буфере.

Эту процедуру удобнее использовать в сочетании с алгоритмом построчного сканирования с z-буфером, поскольку для полного алгоритма с z- буфером требуется очень много памяти.

⚠️ **GitHub.com Fallback** ⚠️