PBR-Materialien
PBR-Materialien sind einer der unterstützten Materialtypen in Azure Remote Rendering. Sie werden für Dreiecks-Gittermodelle verwendet, die eine realistische Beleuchtung erhalten sollen. Punktwolken hingegen sind nicht von dynamischer Beleuchtung betroffen.
PBR steht für Physically Based Rendering. Dies besagt, dass das Material die visuellen Eigenschaften einer Oberfläche auf physikalisch plausible Weise beschreibt, sodass realistische Ergebnisse unter allen Beleuchtungsbedingungen möglich sind. Die meisten modernen Spiele-Engines und Inhaltserstellungstools unterstützen PBR-Materialien, da sie als die beste Annäherung an realistische Szenarien für Echtzeitrendering angesehen werden.
Physically Based Rendering beinhaltet im Wesentlichen die Verwendung der Eigenschaften BaseColor, Metalness und Roughness zum Emulieren einer breite Palette realistischer Materialien. Eine ausführliche Beschreibung von PBR würde den Rahmen dieses Artikels sprengen. Ausführlichere Informationen zu PBR finden Sie in weiteren Quellen.
PBR-Materialien sind jedoch keine Universallösung. Es gibt Materialien, die Licht je nach Blickwinkel unterschiedlich reflektieren. Hierzu zählen einige Stoffarten und Autolacke. Diese Arten von Materialien werden vom standardmäßigen PBR-Modell nicht behandelt und von Azure Remote Rendering zurzeit nicht unterstützt. Diese Einschränkung gilt auch für PBR-Erweiterungen, z. B. Thin-Film (mehrschichtige Oberflächen) und Clear-Coat (für Autolacke).
PBR-Materialeigenschaften
Die folgenden Materialeigenschaften werden in der Laufzeit-API verfügbar gemacht, z. B. in der C#-Klasse PbrMaterial bzw. der C++-Klasse PbrMaterial.
PbrFlags
: Verschiedene Featureflags können in dieser Bitmaske kombiniert werden, um die folgenden Features zu aktivieren:TransparentMaterial
: Für PBR-Materialien gibt es nur eine Transparenzeinstellung: Sie ist aktiviert oder deaktiviert. Die Deckkraft wird durch den Alphakanal der Albedo-Farbe definiert. Wenn diese Option aktiviert ist, wird eine komplexere Renderingmethode aufgerufen, um semitransparente Oberflächen zu zeichnen. Azure Remote Rendering implementiert echte reihenfolgenunabhängige Transparenz (Order-Independent Transparency, OIT). Transparente Geometrie ist aufwendig zu Rendern. Wenn Sie nur Lücken in einer Oberfläche benötigen, z. B. für die Blätter eines Baums, empfiehlt es sich, stattdessen Alpha-Clipping zu verwenden.
Beachten Sie in der obigen Abbildung, dass die äußerste rechte Kugel vollständig transparent ist und die Reflexion dennoch sichtbar ist.
Wichtig
Wenn ein Material zur Laufzeit von undurchsichtig in transparent geändert werden soll, muss der Renderer den TileBasedComposition-Renderingmodus verwenden. Diese Einschränkung gilt nicht für Materialien, die zunächst als transparente Materialien konvertiert werden.
UseVertexColor
: Wenn das Gittermodell vertex-Farben enthält und diese Option aktiviert ist, wird die vertex-Farbe des Gittermodells inAlbedoColor
undAlbedoMap
multipliziert. Standardmäßig istUseVertexColor
deaktiviert.DoubleSided
: Wenn diese Eigenschaft auf „true“ festgelegt ist, werden Dreiecke mit diesem Material auch dann gerendert, wenn die Kamera auf ihre Rückseite gerichtet ist. Für die PBR-Materialien wird die Beleuchtung auch für die Rückseite korrekt berechnet. Diese Option ist standardmäßig deaktiviert. Siehe auch Single-sided rendering.SpecularHighlights
: Ermöglicht Glanzlichter für dieses Material. Standardmäßig ist dasSpecularHighlights
-Flag aktiviert.AlphaClipped
: Ermöglicht harte Ausschnitte pro Pixel auf der Basis eines unter dem Wert vonAlphaClipThreshold
liegenden Alphawerts (siehe unten). Dies funktioniert auch bei opaken Materialien.FresnelEffect
: Dieses Materialflag ermöglicht den additiven Fresneleffekt für das jeweilige Material. Die Darstellung des Effekts wird durch die anderen FresnelparameterFresnelEffectColor
undFresnelEffectExponent
bestimmt, die im Folgenden erläutert werden.TransparencyWritesDepth
:Wenn dasTransparencyWritesDepth
-Flag für das Material festgelegt und das Material transparent ist, leisten Objekte, die dieses Material verwenden, einen Beitrag zum letzten Tiefenpuffer. Sehen Sie sich das PBR-Materialflag transparent im nächsten Abschnitt an. Es wird empfohlen, dieses Feature zu aktivieren, wenn Ihr Anwendungsfall einen plausibleren Farbverschiebungsausgleich für vollständig transparente Szenen erfordert. Bei Szenen, die teilweise transparent und teilweise nicht transparent sind, kann diese Einstellung zu nicht plausiblem Reprojektionsverhalten oder nicht plausiblen Reprojektionsartefakten führen. Aus diesem Grund wird dieses Flag für normale Anwendungsfälle standardmäßig deaktiviert. Diese Einstellung wird auch empfohlen. Die geschriebenen Tiefenwerte werden der pixelbasierten Tiefenebene des Objekts entnommen, das sich der Kamera am nächsten befindet.
AlbedoColor
: Diese Farbe wird mit anderen Farben multipliziert, z. B. mitAlbedoMap
- oder vertex-Farben. Wenn transparency für ein Material aktiviert ist, wird der Alphakanal verwendet, um die Deckkraft anzupassen, wobei1
vollständig undurchsichtig und0
vollständig transparent bedeutet. Die Standardalbedofarbe ist opakes Weiß.Hinweis
Wenn ein PBR-Material vollständig transparent ist, z. B. eine vollkommen saubere Glasoberfläche, reflektiert es immer noch die Umgebung. Helle Stellen wie die Sonne sind in der Reflexion immer noch sichtbar. Dies ist bei Farbmaterialien anders.
AlbedoMap
: Eine 2D-Textur für Albedowerte pro Pixel.AlphaClipThreshold
: Wenn dasAlphaClipped
-Flag für diePbrFlags
-Eigenschaft festgelegt ist, werden alle Pixel, bei denen der Albedoalphawert unterAlphaClipThreshold
liegt, nicht gezeichnet. Alphaclipping kann auch ohne Aktivierung der Transparenz verwendet werden, und es beschleunigt das Rendern. Materialien, auf die Alphaclipping angewendet wird, werden dennoch langsamer gerendert als vollständig undurchsichtige Materialien. Alphaclipping ist standardmäßig deaktiviert.TexCoordScale
undTexCoordOffset
: Die Skalierung wird mit den UV-Texturkoordinaten multipliziert, und der Offset wird addiert. Kann zum Strecken und Verschieben der Texturen verwendet werden. Die Standardskalierung ist (1, 1) und der Standardoffset ist (0, 0).FresnelEffectColor
: Die für dieses Material verwendete Fresnelfarbe. Nur wichtig, wenn das Fresneleffektflag für dieses Material festgelegt wurde (siehe oben). Diese Eigenschaft steuert die Basisfarbe des Fresnel-Glanzes (eine vollständige Erläuterung finden Sie unter Fresnel-Effekt). Gegenwärtig sind nur die RGB-Kanalwerte wichtig und der Alphawert wird ignoriert.FresnelEffectExponent
: Der für dieses Material verwendete Fresnelexponent. Nur wichtig, wenn das Fresneleffektflag für dieses Material festgelegt wurde (siehe oben). Diese Eigenschaft steuert die Verteilung des Fresnel-Glanzes. Der Mindestwert 0,01 bewirkt eine Verteilung über das gesamte Objekt. Der Maximalwert 10,0 schränkt den Glanz nur auf die am stärksten zierenden sichtbaren Kanten ein.PbrVertexAlphaMode
: Bestimmt, wie der Alphakanal von Vertexfarben verwendet wird. Die folgenden Modi sind verfügbar:Occlusion
: Der Alphawert stellt einen Umgebungsverdeckungswert dar und wirkt sich daher nur auf die indirekte Beleuchtung aus dem Himmelsfeld aus.LightMask
: Der Alphawert dient als Skalierungsfaktor für die gesamte Beleuchtungsmenge, was bedeutet, dass Alpha verwendet werden kann, um Bereiche abzudunkeln. Dies wirkt sich sowohl auf die indirekte als auch auf die direkte Beleuchtung aus.Opacity
: Alpha stellt dar, wie undurchsichtig (1,0) oder transparent (0,0) das Material ist.
NormalMap
: Um differenzierte Details zu simulieren, kann Normal Mapping bereitgestellt werden.NormalMapScale
: Ein Skalarwert, der die Stärke der Normal Map skaliert. Bei einem Wert von 1,0 wird der Normalwert der Normal Map unverändert verwendet, beim Wert 0 erscheint die Oberfläche flach. Werte, die größer als 1,0 sind, übertreiben die Störung der Normal Map.Roughness
undRoughnessMap
: „Roughness“ definiert die Glätte oder Rauheit der Oberfläche. Raue Oberflächen streuen das Licht in mehr Richtungen als glatte Oberflächen, wodurch die Reflexionen unscharf werden. Der Wertebereich liegt zwischen0.0
und1.0
. WennRoughness
gleich0.0
ist, werden die Reflexionen scharf dargestellt. WennRoughness
gleich0.5
ist, werden die Reflexionen unscharf dargestellt. Wenn ein roughness-Wert und eine „roughnessMap“ angegeben werden, ist der endgültige Wert das Produkt der beiden.Metalness
undMetalnessMap
: In der Physik entspricht diese Eigenschaft der Angabe, ob eine Oberfläche eine leitende oder eine dielektrische Oberfläche ist. Leitende Materialien verfügen über andere Reflexionseigenschaften und sind in der Regel ohne Albedo-Farbe reflektierend. In PBR-Materialien beeinflusst diese Eigenschaft den Grad, in dem eine Oberfläche die Umgebung reflektiert. Der Wertebereich liegt zwischen0.0
und1.0
. Wenn „metalness“ den Wert0.0
hat, ist die Albedo-Farbe vollständig sichtbar, und das Material sieht wie Kunststoff oder Keramik aus. Wenn „metalness“ den Wert0.5
hat, sieht das Material wie lackiertes Metall aus. Wenn „metalness“ den Wert1.0
hat, weist die Oberfläche kaum noch Albedo-Farbe auf und reflektiert nur die Umgebung. Wenn z. B.metalness
den Wert1.0
undroughness
den Wert0.0
aufweist, sieht die Oberfläche wie ein Spiegel aus. Wenn ein metalness-Wert und eine „metalnessMap“ angegeben werden, ist der endgültige Wert das Produkt der beiden.In der obigen Abbildung sieht die Kugel in der rechten unteren Ecke wie Metall und die Kugel in der linken unteren Ecke wie Keramik oder Kunststoff aus. Die Albedo-Farbe ändert sich auch gemäß den physischen Eigenschaften. Wenn sich die Rauheit erhöht, wird die Reflexion des Materials weniger scharf.
AOMap
undAOScale
: Durch Umgebungsverdeckung werden Objekte mit Spalten realistischer dargestellt, indem verdeckten Bereichen Schatten hinzugefügt werden. Der Verdeckungswertebereich liegt zwischen0.0
und1.0
, wobei0.0
Dunkelheit (verdeckt) und1.0
keine Verdeckung bedeutet. Wenn für die Umgebungsverdeckung eine 2D-Textur bereitgestellt wird, wird der Effekt aktiviert, undAOScale
fungiert als Multiplikator.
Farbmaterialüberschreibungen während der Konvertierung
Eine Teilmenge der Farbmaterialeigenschaften kann während der Modellkonvertierung mittels der Materialüberschreibungsdatei überschrieben werden. Die folgende Tabelle zeigt die Zuordnung zwischen den oben dokumentierten Laufzeiteigenschaften und dem entsprechenden Eigenschaftsnamen in der Überschreibungsdatei:
Materialeigenschaftsname | Eigenschaftsname in der Überschreibungsdatei |
---|---|
PbrFlags.TransparentMaterial |
transparent |
PbrFlags.AlphaClipped |
alphaClipEnabled |
PbrFlags.UseVertexColor |
useVertexColor |
PbrFlags.DoubleSided |
isDoubleSided |
PbrFlags.TransparencyWritesDepth |
transparencyWritesDepth |
AlbedoColor |
albedoColor |
TexCoordScale |
textureCoordinateScale |
TexCoordOffset |
textureCoordinateOffset |
NormalmapScale |
normalMapScale |
Metalness |
metalness |
Roughness |
roughness |
AlphaClipThreshold |
alphaClipThreshold |
Technische Details
Azure Remote Rendering verwendet die auf dem Cook-Torrance-Modell basierende Mikrofacetten-BRDF. Diese beinhaltet GGX-NDF, die Schlick-Fresnel-Gleichung und eine mit GGX korrelierte Smith-Sichtbarkeitsfunktion mit einer Abschwächungsfunktion nach dem Lambert-Beer'schen Gesetz. Dieses Modell ist derzeit der Industriestandard. Ausführlichere Informationen finden Sie in diesem Artikel: Physically based Rendering – Cook-Torrance
Eine Alternative zu dem in Azure Remote Rendering verwendeten Metalness-Roughness-PBR-Modell ist das Specular-Glossiness-PBR-Modell. Dieses Modell kann einen breiteren Bereich von Materialien darstellen. Es ist jedoch teurer und eignet sich in der Regel nicht gut für die Anwendung in Echtzeit. Eine Konvertierung von Specular-Glossiness in Metalness-Roughness ist nicht immer möglich, da (Diffuse, Specular)-Wertepaare vorhanden sind, die nicht in (BaseColor, Metalness) konvertiert werden können. Die Konvertierung in die andere Richtung ist einfacher und präziser, da alle (BaseColor, Metalness)-Paare wohldefinierten (Diffuse, Specular)-Paaren entsprechen.
API-Dokumentation
- C#-Klasse „PbrMaterial“
- C# RenderingConnection.CreateMaterial()
- C++-Klasse „PbrMaterial“
- C++ RenderingConnection::CreateMaterial()