Сопоставление материалов для форматов модели
В процессе преобразования исходного ресурса, как модели, преобразователь создает материалы для каждой сетки. Способ создания материалов можно переопределить. По умолчанию при преобразовании создаются материалы PBR. Поскольку каждый формат исходного файла (например, FBX) использует собственные соглашения для определения материалов, эти соглашения должны быть сопоставлены с параметрами материалов PBR для удаленной отрисовки Azure.
В этой статье приводятся точные сопоставления, используемые для преобразования материалов исходных ресурсов в материалы среды выполнения.
glTF
Практически все параметры спецификации glTF 2.0 поддерживаются службой удаленной отрисовки Azure, за исключением EmissiveFactor и EmissiveTexture.
Сопоставление показано в следующей таблице.
glTF | Удаленная отрисовка Azure |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metallicFactor | metalness |
metallicTexture | metalnessMap |
roughnessFactor | roughness |
roughnessTexture | roughnessMap |
occlusionFactor | occlusion |
occlusionTexture | occlusionMap |
normalTexture | normalMap |
normalTextureInfo.scale | normalMapScale |
alphaCutoff | alphaClipThreshold |
alphaMode.OPAQUE | alphaClipEnabled = false, isTransparent = false |
alphaMode.MASK | alphaClipEnabled = true, isTransparent = false |
alphaMode.BLEND | isTransparent = true |
doubleSided | isDoubleSided |
emissiveFactor | - |
emissiveTexture | - |
Каждая текстура glTF может иметь значение texCoord
, также поддерживаемое в материалах удаленной отрисовки Azure.
Встроенные текстуры
Поддерживаются текстуры, внедренные в файлы *.bin или *.glb .
Поддерживаемое расширение glTF
Кроме базового набора функций, служба удаленной отрисовки Azure поддерживает следующие расширения glTF:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: соответствует цветным материалам. Это расширение рекомендуется использовать для излучающих материалов.
- KHR_materials_pbrSpecularGlossiness: вместо шероховатых металлических можно воспользоваться рассеивающими зеркально-глянцевыми текстурами. Реализация удаленной отрисовки Azure вытекает из формул преобразования на основе расширения.
FBX
Формат FBX является закрытым источником, и материалы FBX не совместимы с материалами PBR в целом. В FBX используется сложное описание поверхностей со множеством уникальных параметров и свойств, не все из которых используются конвейером удаленной отрисовки Azure.
Важно!
Конвейер преобразования модели удаленной отрисовки Azure поддерживает только FBX 2011 и более поздние версии.
Формат FBX определяет консервативный подход к материалам. В официальной спецификации FBX существуют только два типа освещения:
- Ламберт — не часто используется уже некоторое время, но он по-прежнему поддерживается путем преобразования в Phong во время преобразования.
- По методу Фонга — данный тип используется почти для всех материалов и большинства средств для работы с содержимым.
Модель Phong является более точной, и она используется в качестве единственной модели для материалов FBX. Далее она рассматривается как материал FBX.
В приложении Maya используются два пользовательских расширения для FBX благодаря определению пользовательских свойств для типов материалов PBR и Stingray. Эти сведения не включены в спецификацию FBX и в настоящее время не поддерживаются службой удаленной отрисовки Azure.
Материалы FBX используют концепцию уровня рассеивающего зеркального отражения Diffuse-Specular-SpecularLevel, поэтому для преобразования рассеивающей текстуры в карту Аlbedo необходимо вычислить другие параметры, чтобы убрать их из диффузии.
Все цвета и текстуры FBX находятся в пространстве sRGB (известном как гамма-пространство), но во время визуализации Служба удаленной отрисовки Azure работает с линейным пространством и в конце фрейма преобразует все обратно в пространство sRGB. Конвейер ресурсов удаленной отрисовки Azure преобразует все данные в линейное пространство для отправки в отрисовщик.
В таблице приведено сопоставление текстур материалов FBX с материалами удаленной отрисовки Azure. Некоторые из них не используются напрямую, но в сочетании с другими текстурами, участвующими в формулах (например, диффузная текстура):
FBX | Удаленная отрисовка Azure |
---|---|
AmbientColor | Occlusion Map |
DiffuseColor | используется для Аlbedo, металлических свойств |
TransparentColor | используется для альфа-канала Аlbedo |
TransparencyFactor | используется для альфа-канала Аlbedo |
Непрозрачность | используется для альфа-канала Аlbedo |
SpecularColor | используется для Аlbedo, металлических свойств, шероховатости |
SpecularFactor | используется для Аlbedo, металлических свойств, шероховатости |
ShininessExponent | используется для Аlbedo, металлических свойств, шероховатости |
NormalMap | NormalMap |
Bump | преобразуется в NormalMap |
EmissiveColor | - |
EmissiveFactor | - |
ReflectionColor | - |
DisplacementColor | - |
Приведенное выше сопоставление является наиболее сложной частью преобразования материалов ввиду большого числа сделанных допущений. Эти допущения рассматриваются далее.
Некоторые используемые ниже определения:
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
.Red ∗ 0.2125 +Specular
.Green ∗ 0.7154 +Specular
.Blue ∗ 0.0721DiffuseBrightness
= 0.299 *Diffuse
.Red2 + 0.587 *Diffuse
.Green2 + 0.114 *Diffuse
.Blue2SpecularBrightness
= 0.299 *Specular
.Red2 + 0.587 *Specular
.Green2 + 0.114 *Specular
.Blue2SpecularStrength
= max(Specular
.Red,Specular
.Green,Specular
.Blue)
Формула интенсивности зеркального эффекта SpecularIntensity получена здесь. Формула яркости описана в этой спецификации.
Неровность
Roughness
вычисляется на основе Specular
и ShininessExponent
посредством этой формулы. Формула является аппроксимацией шероховатости экспоненты по методу Фонга:
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
Металлические свойства
Metalness
вычисляется на основе Diffuse
и Specular
посредством этой формулы из спецификации glTF.
Идея заключается в том, что мы решаем уравнение: Ax2 + Bx + C = 0. Диэлектрические поверхности отражают примерно 4% света, а остальной свет рассеивается. Металлические поверхности не рассеивают свет, а только отражают. Эта формула имеет несколько недостатков, потому что нет способа различать глянцевые пластиковые и глянцевые металлические поверхности. Мы предполагаем, что большая часть времени поверхность имеет металлические свойства, и поэтому глянцевые пластиковые или резиновые поверхности могут не выглядеть должным образом.
dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength
A = dielectricSpecularReflectance
B = (DiffuseBrightness * (oneMinusSpecularStrength / (1 - A)) + SpecularBrightness) - 2 * A
C = A - SpecularBrightness
squareRoot = sqrt(max(0.0, B * B - 4 * A * C))
value = (-B + squareRoot) / (2 * A)
Metalness = clamp(value, 0.0, 1.0);
Albedo
Albedo
вычисляется на основе Diffuse
, Specular
и Metalness
.
Как упоминалось в разделе "Металлические свойства", диэлектрические поверхности отражают примерно 4% света.
Суть заключается в линейной интерполяции цветов Dielectric
и Metal
с использованием в качестве коэффициента значения Metalness
. Если металличность имеет 0.0
значение, то в зависимости от спектра он будет либо темным цветом (если спектрулярный высокий), либо диффузный не изменится (если не присутствует зрителя). При большом значении металлических свойств рассеивающий цвет практически отсутствует, а преобладает отражающий цвет.
dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength
dielectricColor = diffuseColor * (oneMinusSpecularStrength / (1.0f - dielectricSpecularReflectance) / max(1e-4, 1.0 - metalness))
metalColor = (Specular - dielectricSpecularReflectance * (1.0 - metalness)) * (1.0 / max(1e-4, metalness))
albedoRawColor = lerpColors(dielectricColor, metalColor, metalness * metalness)
AlbedoRGB = clamp(albedoRawColor, 0.0, 1.0);
AlbedoRGB
вычисляется формулой выше, но альфа-канал требует больше вычислений. В формате FBX нет четкого определения прозрачности. Его можно задать разными способами. Для разных средств для работы с содержимым используются различные методы. Суть заключается в объединении их в одну формулу. При этом некоторые ресурсы неправильно отображаются как прозрачные, однако, если они не создаются обычным образом.
Это вычисляется на основе TransparentColor
, TransparencyFactor
, Opacity
:
Если задано свойство Opacity
, используйте его напрямую: AlbedoAlpha
= Opacity
else
If TransparencyColor
is defined, then AlbedoAlpha
= 1.0 - ((TransparentColor.Blue
TransparentColor.Red
+ TransparentColor.Green
+ ) / 3.0) else
Если задано свойство TransparencyFactor
, то AlbedoAlpha
= 1.0 - TransparencyFactor
Окончательный цвет Albedo
имеет четыре канала, объединяющих AlbedoRGB
с AlbedoAlpha
.
Итоги
Цвет Albedo
будет очень близок к исходному Diffuse
, если значение Specular
приближается к нулю. В противном случае поверхность будет выглядеть как металлическая без рассеивающего цвета. Поверхность будет выглядеть отполированной и зеркальной при большом значении свойств ShininessExponent
и Specular
. В противном случае поверхность будет выглядеть шероховатой со слабым отражающим эффектом.
Известные проблемы
- Текущая формула не работает хорошо для простой цветной геометрии. При большом значении
Specular
все геометрические объекты становятся отражающими металлическими поверхностями без какого-либо цвета. Обходной путь в этом случае — снизитьSpecular
до 30 % от исходного или использовать параметр преобразования fbxAssumeIteic. - Материалы PBR недавно добавлены в средства для создания содержимого
Maya
и3DS Max
. Они используют настраиваемые пользовательские свойства "черного ящика" для передачи в FBX. Azure Удаленная отрисовка не считывает эти свойства, так как они не документируются и формат является закрытым источником.