Mapowanie materiałów dla formatów modelu
Gdy zasób źródłowy jest konwertowany jako model, konwerter tworzy materiały dla każdej siatki. Sposób tworzenia materiałów można zastąpić. Jednak domyślnie konwersja tworzy materiały PBR. Ponieważ każdy format pliku źródłowego, taki jak FBX, używa własnych konwencji do definiowania materiałów, te konwencje muszą być mapowane na parametry materiału PBR usługi Azure Remote Rendering.
W tym artykule wymieniono dokładne mapowania używane do konwertowania materiałów z zasobów źródłowych na materiały uruchomieniowe.
glTF
Prawie wszystko, od specyfikacji glTF 2.0 jest obsługiwane w usłudze Azure Remote Rendering, z wyjątkiem EmissiveFactor i EmissiveTexture.
W poniższej tabeli przedstawiono mapowanie:
glTF | Azure Remote Rendering |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metalFactor | metalowość |
metalTexture | metalnessMap |
roughnessFactor | Chropowatości |
roughnessTexture | roughnessMap |
occlusionFactor | Okluzji |
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 | - |
Każda tekstura w pliku glTF może mieć texCoord
wartość, która jest również obsługiwana w materiałach usługi Azure Remote Rendering.
Osadzone tekstury
Obsługiwane są tekstury osadzone w plikach *.bin lub *.glb .
Obsługiwane rozszerzenie glTF
Ponadto w podstawowym zestawie funkcji usługa Azure Remote Rendering obsługuje następujące rozszerzenia glTF:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: odpowiada materiałom kolorowym. W przypadku materiałów emisistycznych zaleca się użycie tego rozszerzenia.
- KHR_materials_pbrSpecularGlossiness: Zamiast tekstur metalicznych szorstkości można zapewnić tekstury dyfuzyjno-błyszczące. Implementacja usługi Azure Remote Rendering bezpośrednio jest zgodna z formułami konwersji z rozszerzenia.
FBX
Format FBX jest zamknięty, a materiały FBX nie są ogólnie zgodne z materiałami PBR. FBX używa złożonego opisu powierzchni z wieloma unikatowymi parametrami i właściwościami, a nie wszystkie z nich są używane przez potok usługi Azure Remote Rendering.
Ważne
Potok konwersji modelu usługi Azure Remote Rendering obsługuje tylko oprogramowanie FBX 2011 i nowsze.
Format FBX definiuje konserwatywne podejście do materiałów, istnieją tylko dwa typy w oficjalnej specyfikacji FBX:
- Lambert - Nie jest już używany przez sporo czasu, ale nadal jest obsługiwany przez konwersję na Stringi w czasie konwersji.
- Phong - Prawie wszystkie materiały i większość narzędzi zawartości używają tego typu.
Model Phong jest dokładniejszy i jest używany jako jedyny model materiałów FBX. Poniżej będzie on określany jako materiał FBX.
Program Maya używa dwóch niestandardowych rozszerzeń dla FBX, definiując właściwości niestandardowe dla typów PBR i Stingray materiału. Te szczegóły nie są uwzględnione w specyfikacji FBX, więc obecnie nie są obsługiwane przez usługę Azure Remote Rendering.
Materiały FBX używają koncepcji Dyfuzor-Specular-SpecularLevel, więc w celu konwersji z tekstury rozproszonej na mapę albedo musimy obliczyć inne parametry, aby odjąć je od dyfuzoru.
Wszystkie kolory i tekstury w FBX znajdują się w przestrzeni sRGB (znanej również jako przestrzeń Gamma), ale usługa Azure Remote Rendering współpracuje z przestrzenią liniową podczas wizualizacji, a na końcu ramki konwertuje wszystko z powrotem na przestrzeń sRGB. Potok zasobu usługi Azure Remote Rendering konwertuje wszystko na przestrzeń liniową w celu wysłania go jako przygotowanych danych do modułu renderowania.
W tej tabeli pokazano, jak tekstury są mapowane z materiałów FBX do materiałów usługi Azure Remote Rendering. Niektóre z nich nie są bezpośrednio używane, ale w połączeniu z innymi teksturami uczestniczącymi w formułach (na przykład teksturą rozproszoną):
FBX | Azure Remote Rendering |
---|---|
AmbientColor | Mapa okluzji |
Dyfuzorcolor | używany dla Albedo, Metalness |
TransparentColor | używany do kanału alfa Albedo |
TransparencyFactor | używany do kanału alfa Albedo |
Krycie | używany do kanału alfa Albedo |
SpecularColor | używany do Albedo, Metalness, Chropowatość |
SpecularFactor | używany do Albedo, Metalness, Chropowatość |
ShininessExponent | używany do Albedo, Metalness, Chropowatość |
NormalMap | NormalMap |
Bump | przekonwertowany na NormalMap |
EmissiveColor | - |
EmissiveFactor | - |
Emocje ionColor | - |
Kolor przesiedlenia | - |
Powyższe mapowanie jest najbardziej złożoną częścią konwersji materiału ze względu na wiele założeń, które należy wykonać. Poniżej omówiono te założenia.
Poniżej użyto niektórych definicji:
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
. Czerwony ∗ 0.2125 +Specular
. Zielony ∗ 0,7154 +Specular
. Niebieski ∗ 0.0721DiffuseBrightness
= 0,299 *Diffuse
. Czerwony2 + 0,587 *Diffuse
. Zielony2 + 0,114 *Diffuse
. Niebieski2SpecularBrightness
= 0,299 *Specular
. Czerwony2 + 0,587 *Specular
. Zielony2 + 0,114 *Specular
. Niebieski2SpecularStrength
= max(Specular
. Czerwony,Specular
. Zielony,Specular
. Niebieski)
Formuła specularIntensity jest uzyskiwana z tego miejsca. Formuła jasności została opisana w tej specyfikacji.
Chropowatości
Roughness
jest obliczany na podstawie Specular
tej formuły i ShininessExponent
przy użyciu tej formuły. Formuła jest przybliżeniem szorstkości z wykładnika widmowego Phong:
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
Metalność
Metalness
jest obliczany na podstawie Diffuse
i Specular
przy użyciu tej formuły ze specyfikacji glTF.
Chodzi o to, że rozwiązujemy równanie: Ax2 + Bx + C = 0. Zasadniczo powierzchnie dielektryczne odzwierciedlają około 4% światła w sposób widmowy, a reszta jest rozproszona. Powierzchnie metaliczne nie odzwierciedlają światła w sposób rozproszony, ale wszystko w sposób widmowy. Ta formuła ma kilka wad, ponieważ nie ma możliwości odróżnienia błyszczących tworzyw sztucznych i błyszczących powierzchni metalicznych. Zakładamy, że większość czasu powierzchnia ma właściwości metaliczne, a więc błyszczące powierzchnie z tworzyw sztucznych/gumowych mogą nie wyglądać zgodnie z oczekiwaniami.
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
program jest obliczany na podstawie Diffuse
parametrów , Specular
i Metalness
.
Zgodnie z opisem w sekcji Metalness powierzchnie dielektryczne odzwierciedlają około 4% światła.
Chodzi o to, aby interpolować liniowo między kolorami Dielectric
i Metal
używając Metalness
wartości jako czynnika. Jeśli metalność to 0.0
, to w zależności od widma będzie to ciemny kolor (jeśli widmo jest wysoki) lub dyfuzor nie zmieni się (jeśli nie ma widma). Jeśli metalność jest dużą wartością, kolor rozproszony zniknie na rzecz koloru widmowego.
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
został obliczony przez formułę powyżej, ale kanał alfa wymaga większej liczby obliczeń. Format FBX jest niejasny na temat przejrzystości i ma wiele sposobów, aby go zdefiniować. Różne narzędzia zawartości używają różnych metod. Chodzi o to, aby zjednoczyć je w jedną formułę. Powoduje to, że niektóre zasoby są niepoprawnie renderowane jako przezroczyste, jeśli jednak nie są one tworzone w typowy sposób.
Jest to obliczane na podstawie TransparentColor
wartości , , TransparencyFactor
Opacity
:
jeśli Opacity
jest zdefiniowany, użyj go bezpośrednio: = AlbedoAlpha
Opacity
inne
jeśli TransparencyColor
jest zdefiniowany, to AlbedoAlpha
= 1.0 - ((TransparentColor.Blue
TransparentColor.Red
+ TransparentColor.Green
+ ) / 3.0) inne
if TransparencyFactor
, then AlbedoAlpha
= 1.0 - TransparencyFactor
Albedo
Końcowy kolor ma cztery kanały, łącząc AlbedoRGB
element z elementem AlbedoAlpha
.
Podsumowanie
Podsumowując tutaj, Albedo
będzie bardzo blisko oryginalnego Diffuse
elementu , jeśli Specular
jest blisko zera. W przeciwnym razie powierzchnia będzie wyglądać jak metaliczne powierzchnie i traci rozproszony kolor. Powierzchnia będzie wyglądać bardziej polerowane i odbijające, jeśli ShininessExponent
jest wystarczająco duża i Specular
jest jasna. W przeciwnym razie powierzchnia będzie wyglądać szorstko i ledwo odzwierciedla środowisko.
Znane problemy
- Bieżąca formuła nie działa dobrze w przypadku prostej geometrii kolorowej. Jeśli
Specular
jest wystarczająco jasny, wszystkie geometrie stają się odbijające metaliczne powierzchnie bez żadnego koloru. Obejściem w tym przypadku jest obniżenieSpecular
do 30% z oryginału lub użycie ustawienia konwersji fbxAssumeMetallic. - Materiały PBR zostały ostatnio dodane do narzędzi do
Maya
tworzenia zawartości i3DS Max
. Używają niestandardowych właściwości czarnej skrzynki zdefiniowanej przez użytkownika, aby przekazać je do FBX. Usługa Azure Remote Rendering nie odczytuje tych właściwości, ponieważ nie są udokumentowane, a format jest zamknięty.