Amnesia: the dark descent

Parallax occlusion mapping

Использование карты расстояний до поверхности

Существует еще один интересный способ для определения видимой точки с учетом карты высот. Он описан
в главе 8 книги GPU Gems 2 (данная глава может быть скачана с сайта компании NVIDIA).

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

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

Рис 14. Функция расстояния до поверхности.

Рис 15. Вспомогательная трехмерная текстура.

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

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

Рис 16. Последовательное приближение к точному решению.

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

Однако важным моментом является правильное согласование размеров вспомогательной текстуры со
значениями внутри нее.

К сожалению данным метод требует специальным образом созданной 3D-текстуры и целого ряда зависимых (dependent)
чтений из текстуры, что весьма отрицательно сказывается на быстродействии.

Свет и материя

Практические рекомендации по созданию PBR текстур

Физически корректный рендеринг (PBR) можно рассматривать скорее как методику, а не как жесткий стандарт. Существуют его принципы и инструкции, но не верно считать его стандартом. Таким образом, могут быть различия в его реализации. Эти различия обычно можно найти в типах карт, используемых в процессе шейдинга (создания материалов), трактовке BRDF (двулучевой функции отражательной способности (ДФОС)) и в том, как значения данных отвечающих за шероховатость / глянцевитость могут быть переназначены в отдельных случаях. Иногда изменяются даже названия карт, но в основе использования PBR заложены одни и те же принципы.

В этом руководстве мы обсудим два наиболее распространенных подхода при создании материалов:

  1. на основе карт металличности (metall) и шероховатости (roughness) [будем этот подход дальше называть metall/roughness], а также
  2. на основе карт зеркального отражения (specular) и глянцевитости (glossiness) [этот подход будем называть specular/glossiness].

как показано на рисунке 01:

Рисунок 01.

Инструменты Substance для создания PBR карт, входящие в состав программ SubstanceDesigner, SubstancePainter и Bitmap2Material 3, поддерживают оба эти подхода. Substance PBR-шейдеры metall/roughness и specular/glossiness используют т.н. GGX-разновидности функции BRDF, в которой не используется переназначение величин шероховатости и глянцевитости. Тем не менее, если пользовательские переназначения все же необходимы – это может быть легко реализовано в Substance материалах. Кроме того, пользовательские шейдеры поддерживаются инструментами Substance, что означает, что вы можете адаптировать Substance инструменты для всех пользовательских пайплайнов.

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

Рабочие процессы [далее я буду использовать также английский термин workflow/-s (который еще означает последовательность операций или подход) или его грубую транскрипцию — воркфлоу/-с) представляют одни и те же данные, но реализуются эти данные по-разному.

В первом томе данного издания мы рассмотрели PBR с технической и теоретической точки зрения. Во 2-м томе мы будем обсуждать практическое применение PBR текстур и сформулируем набор принципов, основанных на фундаментальных знаниях, установленных в первом томе. Мы начнем с переопределения PBR с художественной точки зрения. После этого мы рассмотрим workflow создания двух типов материала: metall/roughness и specular/glossiness, отвечающих общепринятым принципам и правилам. Затем мы подробно определим различия в методах создания (авторинга) таких типов материалов. Поэтому, стоит коротко напомнить основные моменты, чтобы получить полное представление об общих принципах создания PBR текстур.

Причины, по которым запекают текстуры

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


Например, в Blender сборка текстур происходит с помощью нодов. Такую систему не распознают сторонние программы и игровые движки, поэтому их приходится запекать в набор картКадр: Ryan King Art / YouTube

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


Ассет из игры God of War: RagnarokИзображение: Dannie Carlone / ArtStation

3. Когда художник продаёт или делает на заказ модель с использованием PBR-материалов, загруженных с какого-либо ресурса, он рискует нарушить авторское право. Например, на большинство бесплатных материалов портала BlenderKit распространена лицензия Royalty Free, согласно которой пользователь может использовать загруженный контент в своих работах в коммерческих целях, но не в первозданном виде. И в этом случае запекание текстур помогает художнику избежать неприятностей при использовании лицензированного контента: у будущего покупателя не будет доступа к исходникам. Вместо этого он получит наборы текстур, содержащие лишь фрагменты сторонних материалов.


Примеры готовых материалов ткани с маркетплейса BlenderKit, которые можно использовать для одежды персонажа или мебельной обивки. Но для этого их нужно запечь в текстуруСкриншот: BlenderKit / Skillbox Media

4. В игровые движки и системы рендеринга нерационально загружать модели, содержащие несколько миллионов полигонов. В целях оптимизации и экономии ресурсов создаётся low-poly-версия high-poly-модели, а все мелкие детали переносятся в виде текстурных карт.

Tips and Tricks

  1. Height maps have to be explicitly stored using the _displ suffix, i.e. road_displ.tif.
  2. Do not attach the height map as an alpha channel of the normal map. Using the alpha channel of the normal map has been deprecated and will no longer work. Save the displacement map in the alpha channel of your _displ texture. The RGB channels can thus be left empty.
  3. You must save your _displ texture using the CryTIF Photoshop plugin. The will write the correct meta data onto a .tif file for it to be converted to a .dds at run-time. In some cases you may need to click ‘Generate Output’ in the CryTIF dialog.
  4. When saving in CryTIF use the DisplacementMap preset to store _displ textures. Height maps will be converted to BC4 textures. If you don’t see any displacement, double check the format in the Editor’s texture file dialog preview. If it isn’t BC4 fix the preset, save and reload.
  5. Ensure you are in High or Very High graphics spec.

Silhouette Artifacts

While the upside of POM is that it’s relatively cheap on performance, it does have a downside of artifacts being presented when visualized on certain angles. This was the main factor behind Silhouette POM’s (Pixel Accurate Displacement Mapping) creation.

Front: POM Displacement 0 Front: POM Displacement 0.01 Front: POM Displacement 0.03 Front: POM Displacement 0.05

Side: POM Displacement 0 Side: POM Displacement 0.01 Side: POM Displacement 0.03 Side: POM Displacement 0.05

As you can see, from the front, it looks great maxed out at 0.05 displacement! However, when viewed from the side angle, the artifacts very noticeable. This will occur on any object that uses POM, not just terrain.

It comes down to level design (masking these issues with other objects, blocking the player from reaching these angles of approach), lighting conditions and restraint when it comes to how much displacement to apply to your textures, if you wish to keep this unnoticeable.

Incorrect Height Bias

Strange darkening in certain areas on surfaces using POM (like in the image below) are due to receiving shadows as the surface displacement is taken into consideration (for all deferred effects like shadows, SSAO, AA, etc).

Please note that this is not POM self shadowing. The problem can be alleviated by adjusting the height bias in the material’s shader parameter section.

Shader Parameters

The Material Editor Legacy has a Heightmap texture slot which is where you set your _displ texture to. This was added to simplify the workflow and give more control over assets.

A Bumpmap texture is still required to use a displacement texture but they no longer need to be in the same folder or have the same name prefix.

Here’s an example of an asset successfully using textures from 4 different folders:

Once Parallax Occlusion Mapping is enabled in the Shader Gen Params, the following options will become available in the Shader Params:

Shader Param

Description

Height Bias

Allows you to move the plane from where the displacement is applied. This is good for getting rid of gaps in meshes or preventing tessellated geometry to displace into other objects that are placed on top of them.

POM Displacement

Set the POM depth. A larger value will yield more depth.

Self Shadow Strength

Allows you to change the strength of the self shadowing. The higher the value, the more self shadowing will be present.

Базовый цвет (RGB — sRGB).

Карта базового цвета – это RGB карта, которая может содержать 2 типа данных:

  1. отраженный цвет для диэлектриков и
  2. силу отражения для металлов,

как показано на рисунке 07.

Цвет, представляющий на этой карте неметаллическую поверхность, означает отражённую длину волны (как было описано в первом томе). А силу отражения эта карта базового цвета показывает тогда, когда область поверхности обозначена как металл на карте металличности.

 

Рисунок 07.

Рекомендации по созданию текстуры базового цвета.

Карта базового цвета (альбедо) может рассматриваться как изображение более равномерное по тональности, т.е. менее контрастное, чем традиционная диффузная текстура. Такой подход нужен, чтобы избежать слишком светлых или слишком темных значений. С точки зрения тона, объекты, на самом деле, намного светлее, чем они нам кажутся. Видимый диапазон тональной яркости можно представить себе разбросом от самого тёмного материала — древесного угля с одной стороны и свежим белым снегом с другой. Мы знаем, что уголь темный, но это не 0,0 значение черного. Значения цвета, которые мы выбираем должны оставаться в пределах диапазона яркости. В отношении диапазонов яркости, в основном, следует ссылаться на значения отраженного цвета для диэлектриков. На рисунке 08, можно увидеть пример, где значение загрязнений находятся ниже правильного диапазона яркости. Для темных участков, значения яркостей должны находиться в диапазоне 30 – 50 sRGB. При этом точность значений должна возрастать: при 30 sRGB они могут быть менее точными и более точными при 50 sRGB. Для ярких цветов значения яркостей не должны быть выше 240 sRGB.

Рисунок 08.

Выше упоминалось, что карта базового цвета (альбедо) содержит данные для отраженного света в терминах диэлектрических материалов и, таким образом, эта карта должна быть лишена информации об освещении, например такой, как т.н. контактные затенения (Ambient occlusion). Однако, из этого правила могут быть исключения: например, для добавления микро-затенений, когда шейдер не сможет обеспечить этот уровень детализации только посредством канала Ambient occlusion, как показано на рисунке 09. Тем не менее, если микро-затенения добавлены к карте, она по-прежнему должна подчинятся рекомендациям касательно диапазона яркостей.

Значения яркостей для карты, которая описывает отражательную способность для металлов, должны быть получены реальными измерениями значений. Значения коэффициента отражения находятся в диапазоне 70 – 100%. Этот диапазон может быть отображен значениями sRGB 180 – 255. В разделе Substance PBR Utilities мы обсудим инструменты, которые обеспечивают предустановленные значения F0 для обычных материалов. Полезным информационным ресурсом, кроме этого, может стать (Sebastien Lagarde), где приведены графики значений яркостей для карт металличности и шероховатости.

Рисунок 09.

  1. Цвет представляет собой альбедо для неметаллических материалов и значение отражения для металлов.
  2. Основной цвет должен быть лишен информации об освещении, за исключением микро-затенений.
  3. Для темных участков, значения яркостей должны находиться в диапазоне 30 – 50 sRGB. При этом точность значений должна возрастать: при 30 sRGB они могут быть менее точными и более точными при 50 sRGB.
  4. Для ярких цветов значения яркостей не должны быть выше 240 sRGB.
  5. Коэффициент отражения для чистого (неокрашенного) металла будет в диапазоне 70-100%, который можно отобразить значениями sRGB 180 – 255.

В следующем разделе, посвященном картам, описывающим металлы, будет показано, что базовый цвет также может содержать значения для описания отражательной способности металлов. Если информацию об участках поверхности с загрязнениями или окислениями добавить к карте базового цвета, то это приведет к тому, что отражательная способность участков металла будет понижена до диапазона, которые не должен соответствовать значениям чистого металла. Добавление участков загрязнений или окисления также должны быть учтены в карте металличности. Значения для отражений на metallic map также должны быть снижены в этих областях, чтобы обозначить, что эти участки больше не рассматриваются в качестве исходного металла. Например, на рисунке 10 видно, что ржавый металл рассматривается как диэлектрик и описан черным цветом в карте металличности.

Рисунок 10.

Parallax Mapping

Простейшим случаем моделирования рельефа (не считая bumpmapping-а) является так называемый parallax (relief) mapping
— простой способ коррекции текстурных координат с использованием карты высот.

Когда неровная поверхность (задаваемая картой высот h(s,t)) рассматривается с направления
v, то если мы не учитываем микрорельефа поверхности, в качестве точки на ней будет
взята точка А (точнее, соответствующие этой точке текстурные координаты).
Однако точному пересечению луча от наблюдателя соответствует точка В (и соответствующая ей точка T*
в текстурных координатах).

Рис. 3. Приближенное вычисление точки на поверхности.

Подобное явления — т.е

изменение текстурных координат в зависимости от направления на наблюдателя
в связи с микрорельефом поверхности, и называется parallax mapping.
Обратите внимание, что все вычисления проводятся в касательном пространстве грани (tangent space), поэтому важно, чтобы для
каждой грани было правильно задано касательное пространство

Можно использовать значение высоты в точке А для получения более точного значения текстурных
координат (T1):

В этой формуле через v обозначен единичный вектор на наблюдателя в касательной системе
координат, т.е. vxy — это касательная компонента, а vz — нормальная.
Через h обозначено значение из карты высоты в точке T.

Что такое PBR?

Физически корректный рендеринг (PBR) является методом затенения (шейдинга) и рендеринга, при котором обеспечивается более точное представление о том, как свет взаимодействует с поверхностью. Эти представления могут быть отнесены к физически корректному рендерингу (PBR) или физически корректному шейдину (PBS). В зависимости от того, какой аспект рабочего процесса обсуждается, PBS, как правило, специфичен для процесса шейдинга, а PBR, характерен для рендеринга и освещения. В комплексе оба термина описывают процесс достижения определенной цели с физически корректной точки зрения.

Каковы преимущества PBR?

Рассматриваемые преимущества PBR с художественной точки зрения и эффективности производства, могут заключаются в следующем:

  1. Унифицируется процесс получения реалистичных свойств, путем устранения расхождений в атрибутах (свойствах) поверхностей, например, в таком свойстве, как зеркальность. Этих расхождений удается избежать благодаря общей методологии и алгоритмам, основанным на физически точных формулах.
  2. Материалы будут выглядеть корректно в любых условиях освещения.
  3. Обеспечивается совместимость рабочего процесса по созданию материалов между разными художниками.

Что это означает для художника?

Мы, как 3D художники должны думать несколько иначе о картах, которые описывают свойства поверхности. Существуют новые типы карт с правилами их создания и принципами которые стоит соблюдать.

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

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

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

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

Cone Step Mapping, Relaxed Cone Step Mapping

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

Рис 17. Конусы на поверхности.

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

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

Рис 18. Построение приближений к точке пересечения.

К сожалению классический метод cone step mapping отличается довольно медленной сходимостью, в силу чего существует
его модификация, смягчающая ограничения на ширину конуса — луч может пересечь поверхность, но не более одного раза (см. рис 19).
Таким образом луч может пройти сквозь поверхность, но это сразу же определяется.

Рис 19. Построение приближений к точке пересечения. Красным обозначен классический вариант, зеленым — relaxed.

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

Рис 20. Нахождение пересечения.

Таким образом полседний вариант (relaxed cone step mapping) отличается более высокой скоростью сходимости и, как и метод с функций
расстояния, гарантирует, что даже мелкие детали не будут пропущены (что может иметь место при проверке отдельных слоев).
Следующий рисунок иллюстрирует каким образом находится пересечение луча и конуса.

Рис 21. Нахождение пересечения луча и конуса.

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

На что обращать внимание при запекании текстур

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

Перед запечкой необходимо подготовить так называемый кейдж (от англ. cage) — продублированный меш low-poly-объекта. Кейдж должен максимально плотно прилегать к high-poly- и low-poly-моделям, но не пересекаться с их геометрией. Таким образом исходящие лучи при запекании будут отскакивать от кейджа и получать информацию о том, как преобразовывать мелкие детали high-poly-объекта в карту нормалей для low-poly.

Пример переноса деталей в Blender с использованием кейджа

Примечание

Во время процесса переноса нельзя изменять геометрию low-poly модели и кейджа, иначе на запечённых текстурах появятся артефакты. Если остались какие-то детали, которые нужно перекрыть кейджем, то геометрию кейджа можно двигать только в пространстве путём перемещения, не меняя направление граней и вершин.

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

Чаще всего после запекания текстур на поверхности низкополигонального объекта образуются артефакты из-за отсутствия шва в местах жёстких рёбер, о которых мы упоминали в материале про UV-развёртку. В этом случае придётся либо переделать развёртку и отметить недостающие швы, либо смягчить углы с помощью специальных инструментов в программе для 3D-моделирования. Например, использование Фаски (Bevel) в Blender на краях высокополигональной модели помогает улучшить качество запекания.


Результат после обычного запекания в Substance Painter и после смягчения граней в Maya. Красным отмечены артефактыКадр: Academic Phoenix Plus / YouTube

Примечание

Перед тем как исправлять артефакты, вызванные швами, оцените, насколько они критичны в контексте текущей задачи

Если модель сделана не для ассета на маркетплейсе и не для игры, а рассчитана на использование в статичном рендере или расположена в сцене таким образом, что данные недочёты не увидит зритель, возможно, рациональнее уделить внимание каким-то более важным вещам.. Ещё одна частая проблема — некорректное отображение нормалей в результате запекания

Полученный рельеф кажется либо слишком вдавленным, либо нечётким, либо его вообще нет. Это связано с тем, что лучи, исходящие от low-poly-объекта, не могут правильно считать информацию о рельефе high-poly-объекта из-за того, что его меш расположен слишком близко или слишком далеко. Эту проблему может исправить корректировка расстояния во время запекания.

Ещё одна частая проблема — некорректное отображение нормалей в результате запекания. Полученный рельеф кажется либо слишком вдавленным, либо нечётким, либо его вообще нет. Это связано с тем, что лучи, исходящие от low-poly-объекта, не могут правильно считать информацию о рельефе high-poly-объекта из-за того, что его меш расположен слишком близко или слишком далеко. Эту проблему может исправить корректировка расстояния во время запекания.


Слева красным выделена ошибка при запекании нормалей. В центре — настройки запекания в Substance Painter, с которыми можно поэкспериментировать для достижения оптимального результата. Справа — результат после примененияКадры: Academic Phoenix Plus / YouTube

С более подробным списком проблем, связанных с запеканием карт нормалей и их решением, можно ознакомиться в четвёртой части туториала This is normal от художника Карлоса Лемонса на ArtStation. На Habr размещён неофициальный перевод этой главы на русский язык.

Parallax Occlusion Mapping

Существует еще один вариант развития steep parallax mapping‘а, получивший название parallax occlusion mapping.

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

Рис 12. Линейное приближение.

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

Ниже приводится фрагментный шейдер, реализующий данный подход.

Понравилась статья? Поделиться с друзьями:
Curious-eyes
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: