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

Материал из SkyXEngine wiki
Перейти к: навигация, поиск

Прозрачность - свойство материала пропускать свет, в контексте 3d графики проявляется в виде невидимого материала за которым видна сцена.

Полупрозрачные материалы (полупрозрачные поверхности - ППП) имеют диапазон прозрачности в пределах [0.5, 1].

Реализация

Так как SkyXEngine использует технику отложенного освещения (deferred shading) то для реализации прозрачности были использованы некоторые трюки:

  • вместо прозрачных поверхностей используются полупрозрачные (непрозрачность в пределах [0.5, 1], в байтах [127, 255]), значения непрозрачности ниже 8, отсекаются альфа тестом (дефайн MTL_ALPHATEST_FORCEBLY_VALUE).
  • рендер ППП осуществляется только в статической геометрии и только после рендера непрозрачных поверхностей
  • расчет освещения происходит в одном проходе как для непрозрачных поверхностей так и для ППП
Итоговое изображение смешивания непрозрачных и полупрозрачного слоев сопровождается альясингом
Итоговое изображение смешивания трех пересекающихся полупрозрачных поверхностей и непрозрачного материала

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

ППП рисуются в тот же G-buffer, в который рисуются непрозрачные поверхности, но с некоторыми ухищрениями (по другому не назвать):

  • stencil буфер метиться значениями что позволяет объединить 4 пикселя в один, зарезервировав верхний левый под непрозрачные поверхности, а остальные под ППП, то есть итоговый G-buffer расслаивается на 4 слоя
На данном скриншоте видно, что через строчку и через столбик в текстуру записан цвет воды
Цветовой буфер с тремя пересекающимися полупрозрачными поверхностями

Таким образом, освещение всех поверхностей осуществляется за один проход освещения, после которого следует объединение всех слоев на основании информации о поверхностях.

Этот метод:

  • позволяет быстро и менее затратно реализовать до 3 перекрывающихся ППП (чего вполне хватает для средней сцены)
  • создает альясинг в местах где есть ППП так как итоговый пиксель состоит из 4 пикселей, для борьбы с этим явление возможно использовать только SSAA если позволяют вычислительные возможности

Использование

Для того чтобы материал был полупрозрачным необходимо:

  • чтобы материал создавался для статической геометрии (только статика поддерживает ППП)
  • текстура с альфа-каналом со значениями меньше 255
  • в параметрах материала указать свойство полупрозрачности

Никаких иных действий для отделения полупрозрачных моделей от непрозрачных совершать не надо.

Рекомендации

  • использовать только ППП, где текстура имеет значение непрозрачности от [0.5, 1]
  • по максимуму использовать полупрозрачные пиксели в текстуре, оставляя минимум непрозрачных, в лучшем случае вообще без них
  • не использовать случаев когда более трех полупрозрачных поверхностей могут быть перекрыты друг другом, в этом случае нет никаких гарантий правильного рендера, но такие случаи редки
  • по минимуму использовать пересекающиеся ППП