Оглавление Дополнительное чтение Учебник «Компьютерная графика» 
Закраска Фонга Тени

Прозрачность

В основных моделях освещения и алгоритмах удаления невидимых линий и поверхностей рассматриваются только непрозрачные поверхности и объекты. Однако существуют и прозрачные объекты, пропускающие свет, например, такие, как стакан, ваза, окно автомобиля, вода. При переходе из одной среды в другую, например из воздуха в воду, световой луч преломляется; поэтому торчащая из воды палка кажется согнутой. Преломление рассчитывается по закону Снеллиуса, который утверждает, что падающий и преломляющий лучи лежат в одной плоскости, а углы падения и преломления связаны формулой h1sinq = h2sinq ', где h1 и h2 — показатели преломления двух сред, q — угол падения, q ' — угол преломления (рис. 27.1). Ни одно вещество не пропускает весь падающий свет, часть его всегда отражается; это также показано на рис. 27.1.

рис. 27.1

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

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

рис. 27.2

Нечто похожее происходит при встраивании перспективного преобразования в видовое преобразование. Обычно перспективное преобразование проводится для того, чтобы получить искаженный объект, который затем строится в аксонометрической проекции с точкой наблюдения, удаленной в бесконечность (рис. 27.3). На рис. 27.3a луч, исходящий из точки P, пересекает неискаженный объект в точке i и после преломления попадает в точку b плоскости фона. На рис. 27.3b показан объект после перспективного преобразования.

рис. 27.3

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

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

Для того чтобы устранить влияние преломления, можно либо применять алгоритмы, работающие в пространстве объекта, либо пользоваться специальными преобразованиями между пространствами объекта и изображения. Однако проще включить преломление в алгоритмы построения видимых поверхностей методом трассировки лучей, использующие глобальную модель освещения.

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

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

Для криволинейных поверхностей, например, таких, как ваза или бутылка, линейной аппроксимации недостаточно, так как вблизи контурных линий прозрачность уменьшается из-за толщины материала. Чтобы точнее изобразить это явление, Кэй предложил несложную нелинейную аппроксимацию на основе z-составляющей нормали к поверхности. В частности, коэффициент прозрачности:
t = tmin + (tmах - tmin)[1 -(1 - |nz|)p],
где tmin и tmax — минимальная и максимальная прозрачность объекта, nz есть z-составляющая единичной нормали к поверхности, р — коэффициент степени прозрачности, t — прозрачность пиксела или точки объекта. На рис. 27.4 сравниваются результаты двух моделей: линейной (рис. 27.4a) и нелинейной (рис. 27.4b).

рис. 27.4

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

  • Для каждого многоугольника:
    • если многоугольник прозрачен, то внести его в список прозрачных многоугольников;
    • если многоугольник непрозрачен и z > zбуфер, записать его в буфер кадра для непрозрачных многоугольников и скорректировать этот буфер.
  • Для каждого многоугольника из списка прозрачных многоугольников:
    • если z => zбуфер, то прибавить его коэффициент прозрачности к значению, содержащемуся в буфере весовых коэффициентов прозрачности;
    • прибавить его интенсивность к значению, содержащемуся в буфере интенсивности прозрачности, в соответствии с правилом Ibn = Ib0tb0 + Ictc, где Ibn — новое значение интенсивности, Ib0 — старое значение интенсивности, записанное в буфере интенсивности прозрачности, Ic — интенсивность текущего многоугольника, tb0 — старый коэффициент прозрачности из буфера весовых коэффициентов прозрачности, tc — коэффициент прозрачности текущего многоугольника. Таким образом, получается взвешенная сумма интенсивностей всех прозрачных многоугольников, находящихся перед ближайшим непрозрачным многоугольником.

Объединим буферы интенсивности для прозрачных и непрозрачных многоугольников в соответствии с правилом:
Ifb = tb0Ib0 + (1 - tb0)Ifb0
где Ifb — окончательная интенсивность в буфере кадра для непрозрачных многоугольников, а Ifb0 — старое значение интенсивности в этом буфере.

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

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

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

Для того чтобы включить преломление в модель освещения, нужно при построении видимых поверхностей учитывать не только падающий, но и отраженный и пропущенный свет (рис. 27.1). Эффективнее всего это выполняется с помощью глобальной модели освещения в сочетании с алгоритмом трассировки лучей для выделения видимых поверхностей. Обычно рассматриваются только зеркально отраженные и пропущенные лучи, так как диффузное отражение от просвечивающих поверхностей порождает бесконечное количество беспорядочно ориентированных лучей. Поэтому моделируются только прозрачные вещества, для которых формула расчета интенсивности является простым расширением ранее описанных моделей. Ее общий вид:
I = kaIa + kdId + ksIs + ktIt,
где индексы a, d, s, t обозначают рассеянный, диффузный, зеркальный и пропущенный свет. В большинстве моделей предполагается, что kt — постоянная и It — интенсивность преломленного света определяется по закону Снеллиуса.

Закраска Фонга Тени