Sceneform bietet Standard-Definitionen für Material (.sfm
), damit Entwickler hervorragende Ergebnisse erzielen können. Entwickler, die ihr Design stark anpassen möchten, können ihre eigenen Definitionen (*.mat
-Dateien) erstellen und auf ihre Assets anwenden. Dafür geben sie das Attribut source
in der Asset-Definition an.
Wichtige Konzepte
- Material
- Ein Material definiert die visuelle Darstellung einer Oberfläche. Damit eine Oberfläche vollständig beschrieben und gerendert wird, liefert ein Material die folgenden Informationen:
- Materialmodell
- Gruppe von nutzungskontrollierbaren benannten Parametern
- Rasterstatus (Mischmodus, Backface-Cuting usw.)
- Vertex-Shader-Code
- Fragment-Shader-Code
- Materialmodell
- Auch als Schattierungsmodell oder Beleuchtungsmodell bezeichnet, definiert das Materialmodell die intrinsischen Eigenschaften einer Oberfläche. Diese Eigenschaften haben direkte Auswirkungen auf die Berechnung der Beleuchtung und damit auf die Darstellung einer Oberfläche.
- Material definition
- Eine Textdatei, die alle Informationen enthält, die für ein Material erforderlich sind. Auf dieser Seite werden die Struktur und das Format von (
*.mat
) Materialdefinitionsdateien beschrieben.
Materialdefinitionen
Eine Materialdefinition ist eine Textdatei, in der alle für ein Material erforderlichen Informationen beschrieben werden:
- Name
- Nutzerparameter
- Materialmodell
- Erforderliche Attribute
- Interpolanten (als Variablen bezeichnet)
- Rasterstatus (Mischmodus usw.)
- Shader-Code (Fragment-Shader, optional Vertex-Shader)
Formatieren
Das Format für Materialdefinition basiert auf JSON, das wir JSONish nennen. Auf der obersten Ebene besteht eine Materialdefinition aus drei verschiedenen Blöcken, die die JSON-Objektnotation verwenden:
material {
// material properties
}
vertex {
// vertex shader, optional
}
fragment {
// fragment shader
}
Eine mindestens zulässige Materialdefinition muss einen material
- und einen fragment
-Block enthalten. Der vertex
-Block ist optional.
Unterschiede bei JSON
In JSON besteht ein Objekt aus Schlüssel/Wert-Paaren. Ein JSON-Paar hat die folgende Syntax:
"key" : value
Dabei kann der Wert ein String, eine Zahl, ein Objekt, ein Array oder ein Literal sein (true
, false
oder null
). Diese Syntax ist in einer Materialdefinition zwar vollständig gültig, aber eine Variante ohne Anführungszeichen um Strings wird in JSONish akzeptiert:
key : value
Anführungszeichen bleiben obligatorisch, wenn der String Leerzeichen enthält.
Die Blöcke vertex
und fragment
enthalten nicht maskierten GLSL-Code ohne Anführungszeichen, der in JSON nicht gültig ist.
Einzeilige Kommentare im C++-Stil sind zulässig.
Beim Schlüssel eines Paars wird zwischen Groß- und Kleinschreibung unterschieden.
Beim Wert eines Paars wird nicht zwischen Groß- und Kleinschreibung unterschieden.
Beispiel
Die folgende Codeliste zeigt ein Beispiel für eine gültige Materialdefinition. Diese Definition verwendet das LitMaterialmodell, verwendet den standardmäßigen undurchsichtigen Mischmodus und erfordert, dass eine Reihe von UV-Koordinaten im gerenderten Mesh enthalten sind und drei Nutzerparameter definiert. In den folgenden Abschnitten dieses Dokuments werden die material
- und fragment
-Blöcke ausführlich beschrieben.
material {
name : "Textured material",
parameters : [
{
type : sampler2d,
name : texture
},
{
type : float,
name : metallic
},
{
type : float,
name : roughness
}
],
requires : [
uv0
],
shadingModel : lit,
blending : opaque
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = texture(materialParams_texture, getUV0());
material.metallic = materialParams.metallic;
material.roughness = materialParams.roughness;
}
}
Material block
Der Materialblock ist ein obligatorischer Block, der eine Liste von Property-Paaren enthält, um alle Nicht-Shader-Daten zu beschreiben.
name
- Typ
string
- Wert
- Beliebiger String. Wenn der Name Leerzeichen enthält, sind doppelte Anführungszeichen erforderlich.
- Beschreibung
- Legt den Namen für das Material fest. Der Name wird zur Fehlerbehebung zur Laufzeit beibehalten.
material {
name : stone
}
material {
name : "Wet pavement"
}
shadingModel
- Typ
string
- Wert
- Optionen:
lit
,cloth
,unlit
. Die Standardeinstellung istlit
. - Beschreibung
- Wählt das Materialmodell aus, wie im Abschnitt Materialmodelle beschrieben.
material {
shadingModel : unlit
}
Parameter
- Typ
- Array von Parameterobjekten
- Wert
Jeder Eintrag ist ein Objekt mit den Properties
name
undtype
, beide vom Typstring
. Der Name muss eine gültige GLSL-ID sein. Der Typ muss einer der in der folgenden Tabelle beschriebenen Typen sein.Typ Beschreibung bool Einzelner boolescher Wert Boolescher Wert2 Vektor mit zwei booleschen Ausdrücken Boolescher Wert 3 Vektor mit 3 booleschen Ausdrücken Bool4 Vektor mit vier booleschen Werten float Einzelne Gleitkommazahl Gleitkommazahl2 Vektor von 2 Gleitkommazahlen Gleitkommazahl3 Vektor aus 3 Gleitkommazahlen Gleitkommazahl4 Vektor aus 4 Gleitkommazahlen int Einzelne Ganzzahl int2 Vektor mit 2 Ganzzahlen int3 Vektor mit 3 Ganzzahlen int4 Vektor mit vier Ganzzahlen Beispiel 2 2D-Textur SamplerExternal Externe Textur. Weitere Informationen finden Sie unter ExternalTexture und setExternalTexture(). - Sampler
Für Sampler-Typen können auch
format
(Standardeinstellung:float
) undprecision
(Standardeinstellung:default
) angegeben werden. Das Format istint
,float
. Die Genauigkeit kanndefault
(beste Genauigkeit für die Plattform, in der Regelhigh
auf Computern,medium
auf Mobilgeräten),low
,medium
oderhigh
sein.- Beschreibung
Listet die für Ihr Material erforderlichen Parameter auf. Diese Parameter können zur Laufzeit mit der Material API von Sceneform festgelegt werden. Der Zugriff auf Parameter über die Shader variiert je nach Parametertyp:
- Samplertypen: Verwenden Sie den Parameternamen mit dem Präfix
materialParams_
. Beispiel:materialParams_myTexture
. - Andere Typen: Verwenden Sie den Parameternamen als Feld einer Struktur namens
materialParams
. Beispiel:materialParams.myColor
.
- Samplertypen: Verwenden Sie den Parameternamen mit dem Präfix
material {
parameters : [
{
type : float4,
name : albedo
},
{
type : sampler2d,
format : float,
precision : high,
name : roughness
},
{
type : float2,
name : metallicReflectance
}
],
requires : [
uv0
],
shadingModel : lit,
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = materialParams.albedo;
material.roughness = texture(materialParams_roughness, getUV0());
material.metallic = materialParams.metallicReflectance.x;
material.reflectance = materialParams.metallicReflectance.y;
}
}
erfordert
- Typ
- Array von
string
- Wert
- Jeder Eintrag kann einen der folgenden Werte haben:
uv0
,uv1
,color
,tangents
. - Beschreibung
- Listet die für das Material erforderlichen Vertex-Attribute auf. Das Attribut
position
ist automatisch enthalten und muss nicht angegeben werden. Das Attributtangents
ist automatisch erforderlich, wenn Sie ein Schattierungsmodell auswählen, das nichtunlit
ist. Weitere Informationen zum Zugriff auf diese Attribute über die Shader finden Sie in den Shader-Abschnitten dieses Dokuments.
material {
parameters : [
{
type : sampler2d,
name : texture
},
],
requires : [
uv0
],
shadingModel : lit,
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = texture(materialParams_texture, getUV0());
}
}
variables
- Typ
- Array von
string
- Wert
- Bis zu vier Strings müssen jeweils eine gültige GLSL-ID sein.
- Beschreibung
- Definiert benutzerdefinierte Interpolationen (oder Variablen), die vom Vertex-Shader des Materials ausgegeben werden. Jeder Eintrag im Array definiert den Namen eines Interpolanten.
Der vollständige Name im Fragment-Shader ist der Name des Interpolant mit dem Präfix
variable_
. Wenn Sie beispielsweise eine Variable namenseyeDirection
deklarieren, können Sie mitvariable_eyeDirection
im Fragment-Shader darauf zugreifen. Im Vertex-Shader ist der interpolante Name einfach ein Mitglied derMaterialVertexInputs
-Struktur (material.eyeDirection
in Ihrem Beispiel). Jeder Interpolant ist vom Typfloat4
(vec4
) in den Shadern.
material {
name : Skybox,
parameters : [
{
type : sampler2d,
name : skybox
}
],
variables : [
eyeDirection
],
vertexDomain : device,
depthWrite : false,
shadingModel : unlit
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
float theta = acos(variable_eyeDirection.y);
float phi = atan(variable_eyeDirection.z / variable_eyeDirection.x) +
(variable_eyeDirection.x > 0.0 ? 0.0 : PI);
material.baseColor = texture(materialParams_skybox,
vec2((phi + PI / 2.0) / (2.0 * PI), theta / PI));
}
}
vertex {
void materialVertex(inout MaterialVertexInputs material) {
float3 p = getPosition().xyz;
float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
}
}
wird vermischt
- Typ
string
- Wert
- Optionen:
opaque
,transparent
,fade
,add
,masked
. Die Standardeinstellung istopaque
. - Beschreibung
Legt fest, wie und ob das gerenderte Objekt mit dem Inhalt des Renderingziels vermischt wird. Mögliche Mischmodi sind:
- Undurchsichtig: Das Zusammenführen wird deaktiviert, der Alphakanal der Ausgabe des Materials wird ignoriert.
- Transparent: Das Zusammenführen ist aktiviert. Die Ausgabe des Materials wird mithilfe der Quelle-over-Regel von Porter-Duff mit dem Renderingziel kombiniert. In diesem Mischmodus wird die Alphazahl vor der Multiplikation angenommen.
- Überblenden: agiert als
transparent
. Transparenz wird jedoch auch auf Spiegelbeleuchtung angewendet. Imtransparent
-Modus gelten die Alphawerte des Materials nur für die diffuse Beleuchtung. Dieser Mischmodus ist nützlich, um beleuchtete Objekte ein- und auszublenden. - Hinzufügen: Das Zusammenführen ist aktiviert. Die Ausgabe des Materials wird dem Inhalt des Renderingziels hinzugefügt.
- Maskiert: Das Zusammenführen ist deaktiviert. In diesem Mischmodus wird die Alphamaskierung aktiviert. Der Alphakanal der Ausgabe des Materials bestimmt, ob ein Fragment verworfen wird. Weitere Informationen findest du im Abschnitt maskThreshold.
material {
blending : transparent
}
VertexDomain
- Typ
string
- Wert
- Optionen:
object
,world
,view
,device
. Die Standardeinstellung istobject
. - Beschreibung
Definiert die Domain (oder den Koordinatenbereich) des gerenderten Mesh. Die Domain beeinflusst, wie die Eckpunkte im Vertex-Shader transformiert werden. Folgende Domains sind möglich:
- Objekt: Die Eckpunkte werden im Koordinatenbereich des Objekts (oder Modells) definiert. Die Eckpunkte werden mithilfe der Transformationsmatrix des gerenderten Objekts transformiert.
- Welt: Die Eckpunkte werden im Weltkoordinatenraum definiert. Die Eckpunkte werden nicht mit der Transformation des gerenderten Objekts transformiert.
- Ansicht: Die Eckpunkte werden im Sichtbereich (oder Auge oder Kamera) definiert. Die Eckpunkte werden nicht mit der Transformation des gerenderten Objekts transformiert.
- Gerät: Die Eckpunkte werden im normalisierten Geräte- oder Clip-Koordinatenraum definiert. Die Eckpunkte werden nicht mit der Transformation des gerenderten Objekts transformiert.
material {
vertexDomain : device
}
Interpolation
- Typ
string
- Wert
- Beliebig:
smooth
,flat
. Die Standardeinstellung istsmooth
. - Beschreibung
- Gibt an, wie interpolierte oder Variablen zwischen Eckpunkten interpoliert werden.
Wenn dieses Attribut auf
smooth
gesetzt ist, wird für jeden Interpolant eine perspektivische Interpolation ausgeführt. Wennflat
festgelegt ist, wird keine Interpolation ausgeführt und alle Fragmente innerhalb eines bestimmten Dreiecks werden gleich schattiert.
material {
interpolation : flat
}
wird gefiltert
- Typ
string
- Wert
- Optionen:
none
,front
,back
,frontAndBack
. Die Standardeinstellung istback
. - Beschreibung
- Legt fest, welche Dreiecke abgekürzt werden sollen: keine, nach vorn gerichtete Dreiecke, nach hinten gerichtete Dreiecke oder alle.
material {
culling : none
}
colorWrite (Farbe schreiben)
- Typ
boolean
- Wert
true
oderfalse
. Die Standardeinstellung isttrue
.- Beschreibung
- Aktiviert oder deaktiviert Schreibvorgänge in den Farbpuffer.
material {
colorWrite : false
}
Tiefenschreibvorgang
- Typ
boolean
- Wert
true
oderfalse
. Die Standardeinstellung isttrue
.- Beschreibung
- Aktiviert oder deaktiviert Schreibvorgänge in den Tiefenpuffer.
material {
depthWrite : false
}
DeeplinkCulling
- Typ
boolean
- Wert
true
oderfalse
. Die Standardeinstellung isttrue
.- Beschreibung
- Aktiviert oder deaktiviert Tiefentests. Wenn Tiefentests deaktiviert sind, wird ein mit diesem Material gerendertes Objekt immer über anderen undurchsichtigen Objekten angezeigt.
material {
depthCulling : false
}
beidseitig
- Typ
boolean
- Wert
true
oderfalse
. Die Standardeinstellung istfalse
.- Beschreibung
- Aktiviert oder deaktiviert das beidseitige Rendering. Wenn
true
festgelegt ist, wirdculling
automatisch aufnone
gesetzt. Wenn das Dreieck nach hinten gerichtet ist, wird das Dreieck automatisch so umgedreht, dass es nach vorne zeigt.
material {
doubleSided : true
}
Transparenz
- Typ
string
- Wert
- Optionen
default
,twoPassesOneSide
odertwoPassesTwoSides
. Die Standardeinstellung istdefault
. - Beschreibung
- Steuert, wie transparente Objekte gerendert werden. Er ist nur gültig, wenn der Modus
blending
nichtopaque
ist. Keine dieser Methoden kann die konkave Geometrie genau rendern, ist aber in der Praxis oft ausreichend.
Es gibt drei mögliche Transparenzmodi:
default
: Das transparente Objekt wird normal gerendert, wobei derculling
-Modus beibehalten wird usw.twoPassesOneSide
: Das transparente Objekt wird zuerst im Tiefenpuffer gerendert, dann noch einmal im Farbpuffer, wobei dercullling
-Modus übernommen wird. Dadurch wird praktisch nur die Hälfte des transparenten Objekts wie unten dargestellt gerendert.twoPassesTwoSides
: Das transparente Objekt wird zweimal im Farbpuffer gerendert: zuerst mit der Rückseite und dann mit der Vorderseite. In diesem Modus können Sie beide Gesichtergruppen rendern und gleichzeitig Probleme beim Sortieren reduzieren oder beseitigen (siehe unten).twoPassesTwoSides
kann mitdoubleSided
kombiniert werden, um eine bessere Wirkung zu erzielen.
material {
transparency : twoPassesOneSide
}
maskThreshold
- Typ
number
- Wert
- Ein Wert zwischen
0.0
und1.0
. Die Standardeinstellung ist0.4
. - Beschreibung
- Legt den minimalen Alphawert fest, der ein Fragment nicht verworfen werden muss, wenn der Modus
blending
aufmasked
gesetzt ist. Wenn der Mischmodus nichtmasked
ist, wird dieser Wert ignoriert. Mit diesem Wert kann die Darstellung der mit Alphamasken maskierten Objekte gesteuert werden.
material {
blending : masked,
maskThreshold : 0.5
}
Schattenverstärker
- Typ
boolean
- Wert
true
oderfalse
. Die Standardeinstellung istfalse
.- Beschreibung
- Nur im
unlit
-Schattierungsmodell verfügbar. Wenn dieses Attribut aktiviert ist, wird die vom Material berechnete endgültige Farbe mit dem Schattenfaktor (oder der Sichtbarkeit) multipliziert. Dies ermöglicht das Erstellen transparenter Objekte, die den Schatten empfangen (z. B. eine unsichtbare Bodenebene in AR).
material {
name : "Invisible shadow plane",
shadingModel : unlit,
shadowMultiplier : true,
blending : transparent
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
// baseColor defines the color and opacity of the final shadow
material.baseColor = vec4(0.0, 0.0, 0.0, 0.7);
}
}
Variantenfilter
- Typ
- Array von
string
- Wert
- Jeder Eintrag kann einen der folgenden Werte haben:
dynamicLighting
,directionalLighting
,shadowReceiver
oderskinning
. - Beschreibung
- Wird verwendet, um eine Liste von Shader-Varianten anzugeben, die die Anwendung nie benötigt. Diese Shader-Varianten werden während der Codegenerierung übersprungen. Dadurch reduziert sich die Gesamtgröße des Materials. Beachten Sie, dass einige Varianten möglicherweise automatisch herausgefiltert werden. Beispielsweise werden alle Beleuchtungsvarianten (
directionalLighting
usw.) beim Kompilieren einesunlit
-Materials herausgefiltert. Verwenden Sie den Variantenfilter mit Bedacht. Das Herausfiltern einer Variante, die zur Laufzeit erforderlich ist, kann zu Abstürzen führen.
Beschreibung der Varianten: – directionalLighting
, die verwendet wird, wenn ein Richtungslicht im Ambiente vorhanden ist; dynamicLighting
; wird verwendet, wenn ein nicht-indirektes Licht (Punkt, Spot usw.) in der Szene vorhanden ist: shadowReceiver
; wird verwendet, wenn ein Objekt Schatten erhalten kann: skinning
; wird verwendet, wenn ein Objekt mit GPU-Skining animiert wird.
material {
name : "Invisible shadow plane",
shadingModel : unlit,
shadowMultiplier : true,
blending : transparent,
variantFilter : [ skinning ]
}
Vertex-Block
Der Vertexblock ist optional und kann verwendet werden, um die Schattierungsphase des Materials zu steuern. Der Vertex-Block muss einen gültigen ESSL 3.0-Code enthalten (die in OpenGL ES 3.0 unterstützte Version von GLSL). Sie können innerhalb des Vertexblocks mehrere Funktionen erstellen, aber müssen Sie die Funktion materialVertex
deklarieren:
vertex {
void materialVertex(inout MaterialVertexInputs material) {
// vertex shading code
}
}
Diese Funktion wird vom Shading-System automatisch zur Laufzeit aufgerufen und gibt Ihnen die Möglichkeit, Materialeigenschaften mit der Struktur MaterialVertexInputs
zu lesen und zu ändern. Diese vollständige Definition der Struktur finden Sie im Abschnitt Material Vertex-Eingaben.
Mit dieser Struktur können Sie Ihre benutzerdefinierten Variablen/Interpolanten berechnen oder den Wert der Attribute ändern. Mit den folgenden Eckpunktblöcken werden sowohl die Farbe als auch die UV-Koordinaten des Eckpunkts im Zeitverlauf geändert:
material {
requires : [uv0, color]
}
vertex {
void materialVertex(inout MaterialVertexInputs material) {
material.color *= sin(getTime());
material.uv0 *= sin(frameUniforms.time);
}
}
Zusätzlich zur MaterialVertexInputs
-Struktur kann der Vertex-Shading-Code alle öffentlichen APIs verwenden, die im Abschnitt Öffentliche Shader-APIs aufgeführt sind.
Eckex-Eingaben
struct MaterialVertexInputs {
float4 color; // if the color attribute is required
float2 uv0; // if the uv0 attribute is required
float2 uv1; // if the uv1 attribute is required
float3 worldNormal; // only if the shading model is not unlit
float4 worldPosition; // always available
// variable* names are replaced with actual names
float4 variable0; // if 1 or more variables is defined
float4 variable1; // if 2 or more variables is defined
float4 variable2; // if 3 or more variables is defined
float4 variable3; // if 4 or more variables is defined
};
Fragment block
Der Fragmentblock dient der Steuerung der Fragmentierungsphase des Materials. Der Fragmentblock muss einen gültigen ESSL 3.0-Code (die Version von GLSL, die in OpenGL ES 3.0 unterstützt wird) enthalten. Sie können innerhalb des Vertexblocks mehrere Funktionen erstellen, aber müssen Sie die Funktion material
deklarieren:
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
// fragment shading code
}
}
Diese Funktion wird vom Shading-System automatisch zur Laufzeit aufgerufen und gibt Ihnen die Möglichkeit, Materialeigenschaften mit der Struktur MaterialInputs
zu lesen und zu ändern. Die vollständige Definition der Struktur finden Sie im Abschnitt „Material-Fragmenteingaben“. Die vollständige Definition der verschiedenen Mitglieder der Struktur finden Sie im Abschnitt „Materialmodelle“ dieses Dokuments.
Das Ziel der Funktion material()
besteht darin, die für das ausgewählte Schattierungsmodell spezifischen Materialeigenschaften zu berechnen. Hier ist beispielsweise ein Fragmentblock, der ein glänzendes rotes Metall unter Verwendung des Standard-Beleuchtungsschattierungsmodells erzeugt:
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
material.metallic = 1.0;
material.roughness = 0.0;
}
}
Vorbereitungsmaterial-Funktion
Sie müssen prepareMaterial(material)
aufrufen, bevor Sie die Funktion material()
verlassen. Mit dieser prepareMaterial
-Funktion wird der interne Status des Materialmodells eingerichtet. Einige der im Abschnitt „Fragment APIs“ beschriebenen APIs, z. B. shading_normal
, können erst nach dem Aufrufen von prepareMaterial()
aufgerufen werden.
Beachte außerdem, dass das Attribut normal
– wie im Abschnitt Materialfragment-Eingaben beschrieben – nur Auswirkungen hat, bevor prepareMaterial()
aufgerufen wird. Hier ein Beispiel für einen Fragment-Shader, mit dem das Attribut normal
korrekt geändert wird, um einen glänzenden roten Kunststoff mit Bump-Zuordnung zu implementieren:
fragment {
void material(inout MaterialInputs material) {
// fetch the normal in tangent space
vec3 normal = texture(materialParams_normalMap, getUV0()).xyz;
material.normal = normal * 2.0 - 1.0;
// prepare the material
prepareMaterial(material);
// from now on, shading_normal, etc. can be accessed
material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
material.metallic = 0.0;
material.roughness = 1.0;
}
}
Eingaben für Materialfragmente
struct MaterialInputs {
float4 baseColor; // default: float4(1.0)
float4 emissive; // default: float4(0.0)
// no other field is available with the unlit shading model
float roughness; // default: 1.0
float metallic; // default: 0.0, not available with cloth
float reflectance; // default: 0.5, not available with cloth
float ambientOcclusion; // default: 0.0
// not available when the shading model is cloth
float clearCoat; // default: 1.0
float clearCoatRoughness; // default: 0.0
float3 clearCoatNormal; // default: float3(0.0, 0.0, 1.0)
float anisotropy; // default: 0.0
float3 anisotropyDirection; // default: float3(1.0, 0.0, 0.0)
// only available when the shading model is cloth
float3 sheenColor; // default: sqrt(baseColor)
float3 subsurfaceColor; // default: float3(0.0)
// not available when the shading model is unlit
// must be set before calling prepareMaterial()
float3 normal; // default: float3(0.0, 0.0, 1.0)
}
Öffentliche APIs Shader
Typen
GLSL-Typen können zwar direkt (vec4
oder mat4
) verwendet werden, wir empfehlen jedoch die folgenden Aliasse:
Name | GLSL-Typ | Beschreibung |
---|---|---|
Bool2 | bvc2 | Ein Vektor mit zwei booleschen Werten |
Bool3 | bvc3 | Ein Vektor mit drei booleschen Werten |
Bool4 | b4c | Ein Vektor mit vier booleschen Werten |
int2 | Ivec2 | Ein Vektor mit 2 Ganzzahlen |
int3 | Ivec3 | Ein Vektor mit 3 Ganzzahlen |
int4 | Ivec4 | Ein Vektor mit vier Ganzzahlen |
Uint2 | Uvec2 | Ein Vektor von zwei vorzeichenlosen Ganzzahlen |
Uint3 | Uvec3 | Ein Vektor mit drei vorzeichenlosen Ganzzahlen |
Uint4 | Uvec4 | Ein Vektor mit vier vorzeichenlosen Ganzzahlen |
float2. | Gleitkommazahl2 | Ein Vektor aus zwei Gleitkommazahlen |
float3 | Gleitkommazahl3 | Ein Vektor von 3 Gleitkommazahlen |
float4 | Gleitkommazahl4 | Ein Vektor aus 4 Gleitkommazahlen |
float4x4 | Matte | Eine 4 x 4-Gleitkommazahl |
float3x3 | Matte | Eine 3 x 3-Gleitkomma-Matrix |
Mathematik
Name | Typ | Beschreibung |
---|---|---|
PI | float | Eine Konstante für \(\pi\) |
HALF_PI | float | Eine Konstante für\(\frac{\pi}{2}\) |
sättigen(Gleitkommazahl x) | float | Hiermit wird der angegebene Wert zwischen 0,0 und 1,0 |
pow5(float x) | float | Rechenleistung \(x^5\) |
sq(Gleitkommazahl) | float | Rechenleistung \(x^2\) |
max3(float3 v) | float | Gibt den Maximalwert der angegebenen float3 zurück |
mulMat4x4Float3(float4x4 m, float3 v) | Gleitkommazahl4 | Rückgabe \(m * v\) |
mulMat3x3Float3(float4x4 m, float3 v) | Gleitkommazahl4 | Rückgabe \(m * v\) |
Matrizes
Name | Typ | Beschreibung |
---|---|---|
getViewFromWorldMatrix() | Gleitkommazahl 4 x 4 | Matrix, die aus dem Welt- betrachtet in einen Sicht-/Augenbereich |
getWorldFromViewMatrix() | Gleitkommazahl 4 x 4 | Matrix, die vom Weltall in den Weltall konvertiert wird |
getClipFromViewMatrix() | Gleitkommazahl 4 x 4 | Matrix, die vom Sicht-/Augenbereich in den Clipbereich (NDC) konvertiert wird |
getViewFromClipMatrix() | Gleitkommazahl 4 x 4 | Matrix, die aus Clip (NDC) in Ansicht/Auge konvertiert wird |
getClipFromWorldMatrix() | Gleitkommazahl 4 x 4 | Matrix, die aus einer Welt in einen Clip umgewandelt wird |
Frame-Konstanten
Name | Typ | Beschreibung |
---|---|---|
getResolution() | Gleitkommazahl4 | Auflösung der Ansicht in Pixeln: width , height , 1 / width , 1 / height |
getWorldCameraPosition() | Gleitkommazahl3 | Position der Kamera/des Auges im Weltall |
getTime() | float | Zeit in Sekunden, seit die Sceneform-Engine initialisiert wurde. Kann regelmäßig zurückgesetzt werden, um einen präzisen Verlust der Genauigkeit zu vermeiden |
getExposure() | float | Fotometrische Belichtung der Kamera |
getEV100() | float | Belichtungswert bei ISO 100 der Kamera |
Nur Vertex
Die folgenden APIs sind nur im Vertex-Block verfügbar:
Name | Typ | Beschreibung |
---|---|---|
getPosition() | Gleitkommazahl4 | Vertex-Position in der vom Material definierten Domain (Standard: Objekt/Modellbereich) |
getWorldFromModelMatrix() | Gleitkommazahl 4 x 4 | Matrix, die vom Modell- (Objekt-)Raum zum Weltall konvertiert wird |
getWorldFromModelNormalMatrix() | Gleitkommazahl 3 x 3 | Matrix, die Normalwerte vom Modell- (Objekt-)Raum in den Weltraum umwandelt |
Nur Fragment
Die folgenden APIs sind nur im Fragmentblock verfügbar:
Name | Typ | Beschreibung |
---|---|---|
getWorldTangentFrame() | Gleitkommazahl 3 x 3 | Matrix, die in jeder Spalte die tangent (frame[0] ), bi-tangent (frame[1] ) und normal (frame[2] ) des Eckpunkts im Weltall enthält. Wenn das Material für die Bump-Zuordnung kein Tangensraumnormal berechnet oder die Schattierung nicht anisotrop ist, ist in dieser Matrix nur normal gültig. |
getWorldPosition() | Gleitkommazahl3 | Position des Fragments im Weltall |
getWorldViewVector() | Gleitkommazahl3 | Normalisierter Vektor im Weltall von der Fragmentposition zum Auge |
getWorldNormalVector() | Gleitkommazahl3 | Normale Normalisierung im Weltall nach der Bump-Zuordnung (muss nach prepareMaterial() verwendet werden) |
getWorldReflectedVector() | Gleitkommazahl3 | Reflexion des Ansichtsvektors über das Normale (muss nach prepareMaterial() verwendet werden) |
getNdotV() | float | Das Ergebnis von dot(normal,
view) , immer größer als 0 (muss nach prepareMaterial() verwendet werden) |
getColor() | Gleitkommazahl4 | Interpolierte Farbe des Fragments, wenn das Farbattribut erforderlich ist |
getUV0() | Gleitkommazahl2 | Ersten interpolierten Satz von UV-Koordinaten, wenn das Attribut „uv0“ erforderlich ist |
getUV1() | Gleitkommazahl2 | Ersten interpolierten Satz von UV-Koordinaten, wenn das Attribut „uv1“ erforderlich ist |
inverseTonemap(float3) | Gleitkommazahl3 | Wendet den umgekehrten Tone Mapping-Operator auf die angegebene lineare RGB-Farbe an. Dieser Vorgang kann eine Annäherung sein |
inverseTonemapSRGB(float3) | Gleitkommazahl3 | Wendet den umgekehrten Tone Mapping-Operator auf die angegebene nicht lineare sRGB-Farbe an. Dieser Vorgang kann eine Annäherung sein |
luminance(float3). | float | Berechnet die Leuchtkraft der angegebenen linearen sRGB-Farbe. |
Materialmodelle
Für Sceneform-Materialien kann eines der folgenden Modelle verwendet werden:
- Lit (oder Standard)
- Stoff
- Unbeleuchtet
Lit-Modell
Das Beleuchtungsmodell ist das Standardmaterialmodell von Sceneform. Dieses physikalische Schattierungsmodell wurde entwickelt, um eine gute Interoperabilität mit anderen gängigen Tools und Suchmaschinen wie Unity 5, Unreal Engine 4, Substance Designer oder Marmoset Toolbag zu ermöglichen.
Mit diesem Materialmodell können Sie eine große Anzahl nicht metallischer Oberflächen (Dielektronik) oder metallische Oberflächen (Leiter) beschreiben.
Die Darstellung eines Materials mithilfe des Standardmodells wird mithilfe der in der folgenden Tabelle beschriebenen Properties gesteuert.
Eigenschaften des Standardmodells
Attribut | Definition |
---|---|
baseColor | Unterschiedliche Farben für nicht metallische Oberflächen und Spiegelfarbe für metallische Oberflächen |
metallisch | Gibt an, ob eine Oberfläche dielektiv (0,0) oder elektrisch (1,0) ist. Wird häufig als Binärwert verwendet (0 oder 1) |
Rauheit | Die empfundene Glättung (1.0) oder Rauheit (0.0) einer Oberfläche. Auf glatten Oberflächen gibt es scharfe Reflexionen |
Reflexion | Fresnelreflexion bei normalem Qualifikationsanteil für dielektrische Oberflächen. Damit wird die Stärke der Reflexe |
clearCoat | Stärke der Klarlackschicht |
ClearCoatRoughness | Wahrgenommene Glätte oder Rauheit der Klarlackschicht |
Anisotropie | Anisotropie in der Tangens- oder der Tangensrichtung |
AnisotropyDirection | Lokale Oberflächenrichtung |
ambientOcclusion | Definiert, wie viel des Umgebungslichts von einem Oberflächenpunkt aus zugänglich ist. Er ist ein Schattierungsfaktor pro Pixel zwischen 0,0 und 1,0 |
Normal | Ein Detail, das verwendet wird, um die Oberfläche mithilfe einer Bump-Zuordnung (normale Zuordnung) zu stören |
ClearCoatNormal | Ein Detail, das verwendet wird, um die Klarlackschicht mithilfe der Bump-Zuordnung (normale Zuordnung) zu stören |
Emissionen | Zusätzliche diffuse Albedo, um Emissionsoberflächen zu simulieren (z. B. Neons usw.) Diese Property ist in einer HDR-Pipeline mit Bloom Pass größtenteils hilfreich |
Typ und Bereich der einzelnen Properties sind in der Tabelle unten beschrieben.
Attribut | Typ | Bereich | Hinweise |
---|---|---|---|
baseColor | Gleitkommazahl4 | [0–1] | Vormultipliziert Linear-RGB |
metallisch | float | [0–1] | Sollte 0 oder 1 sein |
Rauheit | float | [0–1] | |
Reflexion | float | [0–1] | Werte bevorzugen > 0,35 |
clearCoat | float | [0–1] | Sollte 0 oder 1 sein |
ClearCoatRoughness | float | [0–1] | Zuordnung zu [0..0.6] |
Anisotropie | float | [-1,1] | Anisotropie liegt in der Tangensrichtung, wenn dieser Wert positiv ist |
AnisotropyDirection | Gleitkommazahl3 | [0–1] | Lineares RGB, codiert einen Richtungsvektor im Tangens |
ambientOcclusion | float | [0–1] | |
Normal | Gleitkommazahl3 | [0–1] | Lineares RGB, codiert einen Richtungsvektor im Tangens |
ClearCoatNormal | Gleitkommazahl3 | [0–1] | Lineares RGB, codiert einen Richtungsvektor im Tangens |
Emissionen | Gleitkommazahl4 | rgb=[0..1], a=[-n..n] | Alpha ist die Belichtungskorrektur, |
Grundfarbe
Das Attribut baseColor
definiert die wahrgenommene Farbe eines Objekts (manchmal auch Albedo genannt). Die Auswirkung von baseColor
hängt von der Beschaffenheit der Oberfläche ab. Dies wird durch das Attribut metallic
gesteuert, das im Abschnitt Metallic beschrieben wird.
- Nichtmetalle (Dielektrik)
Definiert die diffuse Farbe der Oberfläche. Reale Werte befinden sich in der Regel im Bereich [10..240], wenn der Wert zwischen 0 und 255 oder im Bereich [0.04..0.94] zwischen 0 und 1 codiert ist. In der folgenden Tabelle finden Sie mehrere Beispiele für Basisfarben für nicht metallische Oberflächen.
Metal sRGB- Hexadezimal Farbe Kohle 0,19, 0,19, 0,19 #323232 Gummi 0,21; 0,21; 0,21 #353535 Schlamm 0,33, 0,24, 0,19 #553d31 Holz 0,53, 0,36, 0,24 #875c3c Vegetation 0,48, 0,51, 0,31 #7b824e Brick 0,58, 0,49, 0,46 #947d75 Pfirsich 0,69, 0,66, 0,52 #b1a884 Beton 0,75, 0,75, 0,73 #c0bfbb - Metalle (Kabel)
Definiert die Spiegelfarbe der Oberfläche. Reale Werte befinden sich in der Regel im Bereich [170..255], wenn der Wert zwischen 0 und 255 oder im Bereich [0.66..1.0] zwischen 0 und 1 codiert ist. In der folgenden Tabelle finden Sie mehrere Beispiele für Grundfarben von metallischen Oberflächen.
Metal sRGB- Hexadezimal Farbe Silver 0,98, 0,98, 0,96 #faf9f5 Aluminium 0,96, 0,96, 0,96 #f4f5f5 Titan 0,81, 0,78, 0,76 #cec8c2 Eisen 0,76, 0,74, 0,73 #c0bdba Platin 0,84, 0,82, 0,79 #d6d1c8 Gold 1,00, 0,87, 0,62 #fedc9d Messing 0,96, 0,89, 0,68 #f4e4ad Copper 0,98, 0,85, 0,72 #fbd8b8
Metallic
Das Attribut metallic
definiert, ob die Oberfläche eine metallische (leiter) oder eine nicht metallische (dielektrische) Oberfläche ist. Dieses Attribut sollte als binärer Wert verwendet werden, entweder 0 oder 1. Zwischenwerte sind nur bei der Verwendung von Texturen nützlich, um Übergänge zwischen verschiedenen Oberflächen zu erstellen.
Diese Eigenschaft kann das Aussehen einer Oberfläche erheblich verändern. Nicht metallische Oberflächen haben eine chromatische diffuse Reflexion und achromatische Spiegelreflexion (reflektiertes Licht ändert die Farbe nicht). Metallische Oberflächen haben keine diffuse Reflexion und chromatische Spiegelreflexion (reflektiertes Licht nimmt die Farbe der Oberfläche auf, wie durch baseColor
definiert).
Der Effekt von metallic
ist unten zu sehen (klicken Sie auf das Bild, um eine größere Version zu sehen).
Rauheit
Die Eigenschaft roughness
steuert die wahrgenommene Glättung der Oberfläche. Wenn roughness
auf 0 gesetzt ist, ist die Oberfläche absolut eben und hochglänzend. Eine rauere Oberfläche ist die Reflexionen. Dieses Attribut wird in anderen Suchmaschinen und Tools häufig als Glänze bezeichnet und ist einfach das Gegenteil der Rauheit (roughness = 1 - glossiness
).
Nichtmetalle
Die Auswirkung von roughness
auf nicht metallische Oberflächen ist unten zu sehen. Klicke auf das Bild, um eine größere Version zu sehen.
Metallindustrie
Die Auswirkung von roughness
auf Metalloberflächen ist unten zu sehen (klicken Sie auf das Bild, um eine größere Version zu sehen).
Reflexion
Die Eigenschaft reflectance
betrifft nur nicht metallische Oberflächen. Mit diesem Attribut kann die Spiegelintensität gesteuert werden. Dieser Wert wird zwischen 0 und 1 definiert und stellt eine Neuzuordnung eines Prozentsatzes der Reflexion dar. Der Standardwert von 0, 5 entspricht beispielsweise einer Reflexion von 4%. Werte unter 0,35 (2 % Reflexion) sollten vermieden werden, da keine realen Materialien eine so geringe Reflexion haben.
Die Auswirkung von reflectance
auf nicht metallische Oberflächen ist unten zu sehen. Klicke auf das Bild, um eine größere Version zu sehen.
Die folgende Grafik zeigt gängige Werte und ihre Beziehung zur Zuordnungsfunktion.
In der folgenden Tabelle werden die Reflexionswerte für verschiedene Arten von Materialien beschrieben. Kein reales Material hat einen Wert unter 2 %.
Material | Reflexion | Attributwert |
---|---|---|
Wasser | 2 % | 0,35 |
Textilien | 4% bis 5,6% | 0,5 bis 0,59 |
Gängige Flüssigkeiten | 2% bis 4% | 0,35 bis 0,5 |
Häufige Edelsteine | 5% bis 16% | 0,56 bis 1,0 |
Kunststoff, Glas | 4% bis 5% | 0,5 bis 0,56 |
Andere dielektrische Materialien | 2% bis 5% | 0,35 bis 0,56 |
Augen | 2,5 % | 0,39 |
Haut | 2,8 % | 0,42 |
Haar | 4,6 % | 0,54 |
Zähne | 5,8% | 0,6 |
Standardwert | 4 % | 0,5 |
Klarlack
Mehrschichtige Materialien sind relativ verbreitet, insbesondere Materialien mit einer dünnen durchscheinenden Schicht über einer Basisebene. Praxisbeispiele sind unter anderem Autofarben, Limonaden, lackiertes Holz und Acryl.
Mit der Property clearCoat
kann Material mit zwei Ebenen beschrieben werden. Die Klarlackschicht ist immer isotrop und dielektiv. In der folgenden Abbildung werden ein Kohlefasermaterial unter dem Standardmaterialmodell (links) und das Modell für Klarlack (rechts) verglichen.
Mit der Eigenschaft clearCoat
wird die Stärke der Klarlackschicht festgelegt. Dies sollte als Binärwert behandelt werden, entweder 0 oder 1. Diese Werte sind nützlich, um die Übergänge zwischen Teilen der Oberfläche mit einer klaren Mantelschicht und Teilen ohne Oberfläche zu steuern.
Der Effekt von clearCoat
auf ein Rohmetall ist unten zu sehen. Klicken Sie auf das Bild, um eine größere Version zu sehen.
Rauheit des Mantels
Das Attribut clearCoatRoughness
ähnelt dem Attribut roughness
, gilt jedoch nur für die Ebene „Klarlack“. Da Klarlackschichten nie absolut grob sind, wird der Wert zwischen 0 und 1 intern einer tatsächlichen Rauheit von 0 bis 0, 6 zugeordnet.
Der Effekt von clearCoatRoughness
auf ein Rohmetall ist unten zu sehen. Klicken Sie auf das Bild, um eine größere Version zu sehen.
Anisotropie
Viele reale Materialien wie gebürstetes Metall können nur mit einem anisotropen Reflexionsmodell repliziert werden. Ein Material kann mithilfe des Attributs anisotropy
vom Standard-isotropen Modell zu einem anisotropen Modell geändert werden. In der folgenden Abbildung werden ein isotropes Material (links) und ein anistropisches Material (rechts) verglichen.
Der Unterschied zwischen anisotropy
von 0,0 (links) bis 1,0 (rechts) auf einem Rohmetall ist unten zu sehen. Klicken Sie auf das Bild, um eine größere Version aufzurufen.
Die folgende Abbildung zeigt, wie die Richtung der anisotropen Hervorhebungen entweder durch positive oder negative Werte gesteuert werden kann: Positive Werte (links) definieren eine Anisotropie in der Tangensrichtung und negative Werte (rechts) in die tangentielle Richtung.
Anisotropierichtung
Das Attribut anisotropyDirection
definiert die Richtung der Oberfläche an einem bestimmten Punkt und steuert somit die Form der Spiegelglättungen. Er wird als Vektor von 3 Werten angegeben, die in der Regel von einer Textur stammen und die Richtungen codieren, die lokal zur Oberfläche liegen.
Der Effekt, dass anisotropyDirection
auf einem Metall mit einer Route dargestellt wird, ist unten zu sehen (klicken Sie auf das Bild, um eine größere Version zu sehen).
Die Routenkarte, die zum Rendern des obigen Bilds verwendet wird, ist unten zu sehen.
Umgebungsverdeckung
Das Attribut ambientOcclusion
definiert, wie viel des Umgebungslichts von einem Oberflächenpunkt aus zugänglich ist. Er ist ein Schattierungsfaktor pro Pixel zwischen 0,0 (vollständig mit Schatten) und 1,0 (vollständig beleuchtet). Dieses Attribut wirkt sich nur auf diffuse indirekte Beleuchtung (bildbasierte Beleuchtung) aus, nicht jedoch auf indirekte Beleuchtung (wie Richtungs-, Punkt- und Spotbeleuchtung) oder eine Spiegelbeleuchtung. In der folgenden Abbildung werden Materialien ohne diffuse äußere Verdeckung (links) und mit ihr (rechts) verglichen.
Normal
Die Eigenschaft normal
definiert die Normalität der Oberfläche an einem bestimmten Punkt. Sie stammt normalerweise aus einer normalen Kartentextur, mit der sich die Property pro Pixel ändern lässt. Die Normalität wird in Tangens bereitgestellt, d. h. +Z-Punkte außerhalb der Oberfläche.
Ein Beispiel: Wir möchten ein Möbelstück aus Lederleder rendern. Die Modellierung der Geometrie für eine korrekte Darstellung des gepolsterten Musters hätte zu viele Dreiecke. Daher wird ein High-Poly-Mesh-Netz in eine normale Karte verankert. Anschließend können Sie die Basiskarte auf ein vereinfachtes Mesh-Netzwerk anwenden. In der folgenden Abbildung wird ein einfaches Mesh ohne normale Zuordnung (links) und damit (rechts) verglichen.
Das Attribut normal
wirkt sich auf die Basisebene und nicht auf die Ebene „Klarlack“ aus.
Normaler Mantel
Das Attribut clearCoatNormal
definiert die Normalität der Klarlackschicht an einem bestimmten Punkt. Ansonsten verhält sie sich wie die Property normal
.
Durchdringend
Mit dem Attribut emissive
kann zusätzliches Licht simuliert werden, das von der Oberfläche abgegeben wird. Er ist definiert als ein float4
-Wert, der eine RGB-Farbe (im linearen Bereich) sowie einen Wert für die Belichtungskorrektur (im Alphakanal) enthält.
Obwohl ein Belichtungswert tatsächlich Kombinationen von Kameraeinstellungen angibt, wird er häufig von Fotografen verwendet, um die Lichtintensität zu beschreiben. Aus diesem Grund können Kameras Fotografen damit erreichen, dass ein Bild über oder unterbelichtet wird. Diese Einstellung kann für die künstlerische Kontrolle, aber auch für eine gute Belichtung verwendet werden (z. B. ist es 18 % in der Mitte in Grau).
Mit dem Wert für die Belichtungskorrektur des Emissionsattributs kann erzwungen werden, dass die Emissionsfarbe heller (positive Werte) oder dunkler (negative Werte) als die aktuelle Belichtung wird. Wenn der Bloom-Effekt aktiviert ist, kann die Verwendung einer positiven Kontaktkompensation das Blühen der Oberfläche erzwingen.
Tuchmodell
Alle zuvor beschriebenen Materialmodelle sind darauf ausgelegt, dichte Oberflächen zu simulieren, sowohl auf Makro- als auch auf Mikroebene. Kleidung und Textilien bestehen jedoch oft aus locker verbundenen Fäden, die das einfallende Licht absorbieren und streuen. Im Vergleich zu harten Oberflächen ist ein Tuch durch ein weicheres Spiegellappen mit einem großen Abfall gekennzeichnet und weist eine Fuzz-Beleuchtung auf, die durch Vorwärts-/Rückwärtsstreuung verursacht wird. Einige Stoffe haben auch zweifarbige Spiegelfarben (z. B. Samt).
In der folgenden Abbildung wird Jeansstoff, der mit dem Standardmodell (links) und dem Stoffmodell (rechts) gerendert wurde, verglichen. Beachten Sie, dass das Standardmaterialmodell die Darstellung eines Musters aus Jeansstoff (links) nicht erfassen kann. Die Oberfläche scheint steif (fast plastisch) und ähnelt einem Tarp anstelle eines Kleidungsstücks. Dies zeigt auch, wie wichtig die weichere Spiegellappe, die durch Absorption und Streuung verursacht wird, für die Regeneration des Stoffes ist.
Velvet ist ein interessanter Anwendungsfall für ein Modell aus Stoff. Wie im Bild unten zu sehen ist, hat diese Art von Gewebe aufgrund der Streuung vor und zurück eine starke Randbeleuchtung. Diese Streuungsereignisse entstehen, wenn die Fasern gerade auf der Oberfläche des Stoffs stehen. Wenn das einfallende Licht aus der entgegengesetzten Richtung in Sichtrichtung kommt, wird das Licht durch die Fasern nach vorne verstreut. Ähnlich verhält es sich, wenn die Lichtquelle aus derselben Richtung wie die Blickrichtung leuchtet: Über die Fasern wird das Licht nach hinten verstreut.
Es gibt wichtige Textiltypen, die nach wie vor von harten Oberflächenmodellen modelliert werden können. Leder, Seide und Satin können beispielsweise mit den Standard- oder anisotropen Materialmodellen nachgebildet werden.
Das Tuchmaterialmodell umfasst alle Parameter, die zuvor für den Standardmaterialmodus definiert wurden, mit Ausnahme von metallischer und reflexion. Außerdem sind zwei zusätzliche Parameter verfügbar, die in der folgenden Tabelle beschrieben sind.
Parameter | Definition |
---|---|
SheenColor | Spiegelfarbton zur Erstellung von zweifarbigen spekulativen Stoffen (Standardeinstellung: \(\sqrt{baseColor}\)) |
subsurfaceColor | Färbung für die diffuse Farbe nach Streuung und Absorption |
Typ und Bereich der einzelnen Properties sind in der Tabelle unten beschrieben.
Attribut | Typ | Bereich | Hinweise |
---|---|---|---|
SheenColor | Gleitkommazahl3 | [0–1] | Lineares RGB |
subsurfaceColor | Gleitkommazahl3 | [0–1] | Lineares RGB |
Für ein samtähnliches Material kann die Grundfarbe Schwarz oder eine dunkle Farbe sein. Für die Farbgebungsinformationen sollte stattdessen die Farbe ausgewählt werden. Verwenden Sie zum Erstellen gebräuchlicherer Stoffe wie Jeans, Baumwolle usw. die Grundfarbe für die Chromatik und verwenden Sie die Standard-Glanzfarbe oder die Farbe der Schimmern auf die Leuchtkraft der Grundfarbe.
Schimmernde Farbe
Mit dem Attribut sheenColor
kann die Spiegelreflexion direkt geändert werden. Es bietet eine bessere Kontrolle über die Darstellung von Stoffen und ermöglicht die Erstellung von zweifarbigen spekulativen Materialien.
In der folgenden Abbildung wird blauer Stoff mit und ohne (links) und mit (rechts) Glanz verglichen (klicken Sie auf das Bild, um eine größere Version zu sehen).
Farbe der Unterseite
Das Attribut subsurfaceColor
ist nicht physisch vorhanden und kann verwendet werden, um die Streuung, teilweise Absorption und Lichtemission in bestimmten Stoffarten zu simulieren. Dies ist besonders nützlich, um weichere Stoffe zu erstellen.
Die folgende Abbildung zeigt die Auswirkungen von subsurfaceColor
. Es zeigt weiße Kleidung (linke Spalte) im Vergleich zu weißem Tuch mit brauner Untergrundstreuung (rechte Spalte). Klicken Sie auf das Bild, um eine größere Version zu sehen.
Unbeleuchtetes Modell
Mit dem Modell für unbeleuchtetes Material können alle Berechnungen zur Beleuchtung deaktiviert werden. Sie dienen in erster Linie zum Anzeigen von vorbeleuchteten Elementen wie einer Cubemap, externen Inhalten wie Videos oder Kameras, Benutzeroberflächen, Visualisierungen oder Debuggings. Das unbeleuchtete Modell stellt nur zwei Eigenschaften bereit, die in der folgenden Tabelle beschrieben sind.
Attribut | Definition |
---|---|
baseColor | Diffusionsfarbe der Oberfläche |
Emissionen | Zusätzliche diffuse Farbe, um Emissionsoberflächen zu simulieren. Dieses Attribut ist hauptsächlich in einer HDR-Pipeline mit Blütendurchgang nützlich |
Typ und Bereich der einzelnen Properties sind in der Tabelle unten beschrieben.
Attribut | Typ | Bereich | Hinweise |
---|---|---|---|
baseColor | Gleitkommazahl4 | [0–1] | Vormultipliziert Linear-RGB |
Emissionen | Gleitkommazahl4 | rgb=[0..1], a=Keine Angabe | Vormultiplizierter linearer RGB-Wert, Alpha wird ignoriert |
Der Wert von emissive
wird, sofern vorhanden, einfach baseColor
hinzugefügt. Der Hauptzweck von emissive
besteht darin, eine unbeleuchtete Oberfläche zum Blühen zu erzwingen, wenn die HDR-Pipeline mit einem Blood Pass konfiguriert ist.
Die folgende Abbildung zeigt ein Beispiel für das unbeleuchtete Materialmodell, das zum Rendern von Debug-Informationen verwendet wird. Klicken Sie auf das Bild, um eine größere Version anzusehen.
Umgang mit Farben
Lineare Farben
Wenn die Farbdaten von einer Textur stammen, verwenden Sie einfach eine sRGB-Textur, um von der automatischen Hardwarekonvertierung von sRGB in linear zu profitieren. Wenn die Farbdaten als Parameter an das Material weitergegeben werden, können Sie von sRGB in linear konvertiert werden, indem Sie den folgenden Algorithmus für jeden Farbkanal ausführen:
float sRGB_to_linear(float color) {
return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
}
Alternativ können Sie eine der beiden günstigeren, aber weniger genauen Versionen verwenden, die unten aufgeführt sind:
// Cheaper
linearColor = pow(color, 2.2);
// Cheapest
linearColor = color * color;
Vormultiplizierter Alphawert
Für eine Farbe wird ein vormultiplizierter Alphawert verwendet, wenn ihre RGB-Komponenten mit dem Alphakanal multipliziert werden:
// Compute pre-multiplied color
color.rgb *= color.a;
Wenn die Farbe aus einer Textur entnommen wird, können Sie einfach dafür sorgen, dass die Texturdaten vorab vorab multipliziert werden. Unter Android werden alle über eine Bitmap hochgeladenen Textur standardmäßig vorab multipliziert.