LIFEfreedom | Дата: Вторник, 17.07.2018, 23:55 | Сообщение # 1 |
Ghost in the Shell
Группа: Модераторы
Сообщений: 1779
Награды: 15
Репутация: 123
Статус: Offline
| Цели С самого начала проекта Knights Province я хотел, чтобы он был визуально приятным. Немного мультяшный стиль с яркими цветами, полуреалистичным мягким освещением и затенением. Ambient Occlusion (AO) – один из тех эффектов затенения (метод глобального фонового или непрямого затенения объектов, прим. пер.), которые добавляют глубину и ощущение масштаба к целой сцене, связывают объекты и выделяют детали.
Состав SSAO Что такое Ambient Occlusion? Так что же такое АО и как оно относится к реальному миру? AO – эффект распространения окружающего света между объектами (отсюда и название эффекта), а также некоторое накопление грязи, естественным образом возникающее в трещинах. Отвечая на распространенное мнение, АО не на 100% основан на реальном мире. Взгляните на угол между стеной и потолком – на нем нет темного градиента (еще хуже, некоторые углы, похоже, приобретают яркость вблизи края из-за отражения света с другой стороны). Тем не менее, AO– хороший художественный эффект, который добавляет глубину к сцене и даёт объектам больше «веса», добавляя деталей, выделяя их.
Как работает AO? АО может выполняться несколькими способами в зависимости от варианта использования. Он может использовать трассировку лучей и пересчитывать каждый кадр (обычно используется для автономного рендеринга, что 3DSMax, Blender и другие приложения для рендеринга обычно делают), когда качество является ключом. Этот метод даёт превосходное качество за счет скорости (Вычисление обычной сцены может занять от 30 секунд до минуты и более). Игры не могут себе этого позволить. В играх AO трассировку лучей можно использовать один раз и «запечь» результат в картах освещения (так называемые lightmaps). Это обеспечивает большую скорость. Недостатки – такие карты можно сделать только для статических объектов. Динамические объекты не будут иметь надлежащего АО на них и на объектах, с которыми они взаимодействуют. Зачастую старые игры сочетают в себе световые карты с поддельными теневыми пятнами под ногами/колёсами и т.п. Это выглядело хорошо в 2000-х годах, когда вычислительные ресурсы были ограничены. Теперь, когда вычислительные мощности графических процессоров достаточно увеличились, можно было бы создать динамические решения для игр – SSAO, HBAO, HBAO+ и другие варианты. Они не подходят к автономным решениям отображения, но все же предлагают достаточно хороший компромисс между производительностью и внешним видом, с некоторыми оговорками.
Параметры Вот короткий список параметров, которые я счел жизнеспособными для Knights Province:
- Предварительно запечённые карты освещения – лучше всего выглядят на статических объектах, но не хорошо справляются с динамическими, нуждаются в большом количестве специальных «хаков», усложняя конвейер отображения. Они также требуют либо отдельной UV-карты, либо уникального UV-картографирования (что плохо сочетается с домами, использующими текстуры и материалы, клонированными деревьями и ландшафтом);
- Динамически запечёные карты освещения или векторные карты - предлагают более общий подход к проблеме, но все еще требуют много хлопот и имеют заметные недостатки;
- SSAO и его варианты – еще более общее решение. Он работает поверх любой геометрии и не заботится о том, как он был объединен. То, что вы видите, это то, что получает AOed - все просто.
Почему я выбрал SSAO? Я выбрал SSAO за его общности, и, обычно, реализации SSAO имеют широкую популярность, что должно означать, что это достаточно хороший компромисс между простотой реализации, производительностью и качеством изображения. Есть много учебных пособий, есть общие проблемы и решений для них, которые также хорошо известны. Методы оптимизации также многочисленны.
Как работает SSAO в целом? SSAO работает, в основном, проверяя окружение каждого пикселя в пределах небольшой сферы, чтобы посмотреть, блокируют ли они окружающий свет, достигающий поверхности. Чем больше окружающих пикселей покрыты другими объектами, тем более окклюдирован пиксель и тем темнее он будет. В идеале, каждый пиксель поверхности проверяет все множество направлений и диапазонов, чтобы увидеть, как он закрывается окружающим пространством. На практике это очень дорогостоящая операция, поэтому проводится только несколько тестов, и их грубые результаты усредняются. На рисунке ниже показана 2D-версия SSAO, где три точки поверхности проверены полусферами, ориентированными на нормальную поверхность (разумная оптимизация):
SSAO требуется отложенное отображение В давние времена, когда рендеринг был проще, графические процессоры отображали кадры за один раз и вычисляли каждый цвет пикселей, вычисляя всё сразу. На данный момент SSAO много раз отображает множество пикселей (даже для грубых результатов каждый пиксель должен проверить 16+ окружающих пикселей, чтобы выяснить его затенение). Из-за этого имеет смысл предварительно получить требуемую информацию и получить доступ к ней из некоторого буфера. Обеспечение этого – сложная доработка конвейера рендеринга. Подход с промежуточными буферами рендеринга называется Отложенным отображением (DR). Раньше игры рисовали объекты один за другим в один проход, теперь же все объекты сначала рисуются во временные буферы (обычно это положение, нормаль к поверхности и цвет), чтобы впоследствии объединить их в окончательное изображение. DR уже есть в игре в некотором виде – это теневые карты, отражения воды и туман войны готовятся в отдельных буферах и объединяются в конечное отображение.
План отложенного отображения Для конвейера отображения необходимо определенное планирование, чтобы найти правильное место и последовательность для каждой операции. Вот как планируется конвейер отображения с DR и SSAO:
Оптимизации SSAO SSAO – очень ресурсоёмкий алгоритм – ему нужно протестировать десятки пикселей для каждого отображаемого пикселя. Оптимизации жизненно важны. Наиболее простые – это выборка только тех точек, которые находятся над тестируемыми поверхностями (тестирование в пределах полусферы, а не всей сферы направлений). Затем происходит рандомизация выборок – это делается путем вращения полушария выборки для каждого следующего пикселя – таким образом, выход более равномерно распределен, но шумный. Размытие помогает уменьшить шум. SSAO имеет ряд элементов управления, позволяющих сбалансировать качество и производительность, например, уменьшать количество используемых тестовых образцов, уменьшая радиус размытия. На данный момент я планирую добавить 3 настройки SSAO – выключен, низкое и высокое качество.
Отсроченное отображение и сглаживание К сожалению, отсроченное отображение не очень хорошо сочетается с традиционными методами сглаживания (AA – от английского Anti-Aliasing, прим. пер.), поскольку отсроченное отображение полагается на точную информацию о пикселях в буферах, только простое сглаживание может работать(кадр рисуется в X раз больше и уменьшается), что является неудачным для SSAO, где каждый новый пиксель должен произвести кучу выборок из окружающих областей. К счастью, существуют известные алгоритмы сглаживания, хорошо подходящие для отсроченного отображения. FXAA довольно популярен и прост в реализации.
Отсроченное отображение и прозрачность Отсроченное отображение испытывает определенные трудности при работе с полупрозрачными поверхностями (STS – от англ. semi-transparent surfaces, прим. пер.), поскольку буфер глубины может содержать только одно значение на пиксель, он является либо поверхностью позади STS, либо STS. Это означает, что либо поверхность позади, либо STS закрашивается неправильно. Существуют разумные методы борьбы с этим (например, с использованием шаблона шахматной доски и хранения каждого второго пикселя с другой поверхности), но для RTS (Real-time strategy, прим. пер.), которая имеет довольно мало STS (а именно частиц дыма и поверхности воды), легче справиться с проблемой просто отображая STS поверх геометрии DR/AO. STS, как правило, не нуждается в прозрачности, так как её прозрачность означает, что, прежде всего, она не создают много резких пикселей. Даже лучше – STS, отображенные поверх нормальной геометрии, покрывают только часть из них, тем самым уменьшая количество резких краев, которые АА необходимо сгладить.
Рекомбинация отображения Когда AO вычисляется и применяется, рендер должен вернуться к «нормальному» функционированию для визуализации STS. Это делается путем записи значений RGB и глубины обратно в буфер и отображение STS с использованием теста глубины по умолчанию.
В следующих статьях (которые уже находятся в работе) я расскажу об FXAA и общих перспективах отображения. P.S. Спасибо Thimo за обзор этой статьи
Здесь может быть ваша реклама. Недорого.
|
|
| |