Referenzmaterial zu benutzerdefiniertem Material

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 ist lit.
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 und type, beide vom Typ string. 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) und precision (Standardeinstellung: default) angegeben werden. Das Format ist int, float. Die Genauigkeit kann default (beste Genauigkeit für die Plattform, in der Regel high auf Computern, medium auf Mobilgeräten), low, medium oder high 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.
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 Attribut tangents ist automatisch erforderlich, wenn Sie ein Schattierungsmodell auswählen, das nicht unlit 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 namens eyeDirection deklarieren, können Sie mit variable_eyeDirection im Fragment-Shader darauf zugreifen. Im Vertex-Shader ist der interpolante Name einfach ein Mitglied der MaterialVertexInputs-Struktur (material.eyeDirection in Ihrem Beispiel). Jeder Interpolant ist vom Typ float4 (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 ist opaque.
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. Im transparent-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 ist object.
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 ist smooth.
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. Wenn flat 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 ist back.
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 oder false. Die Standardeinstellung ist true.
Beschreibung
Aktiviert oder deaktiviert Schreibvorgänge in den Farbpuffer.
material {
    colorWrite : false
}

Tiefenschreibvorgang

Typ
boolean
Wert
true oder false. Die Standardeinstellung ist true.
Beschreibung
Aktiviert oder deaktiviert Schreibvorgänge in den Tiefenpuffer.
material {
    depthWrite : false
}

DeeplinkCulling

Typ
boolean
Wert
true oder false. Die Standardeinstellung ist true.
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 oder false. Die Standardeinstellung ist false.
Beschreibung
Aktiviert oder deaktiviert das beidseitige Rendering. Wenn true festgelegt ist, wird culling automatisch auf none 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 oder twoPassesTwoSides. Die Standardeinstellung ist default.
Beschreibung
Steuert, wie transparente Objekte gerendert werden. Er ist nur gültig, wenn der Modus blending nicht opaque 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 der culling-Modus beibehalten wird usw.

  • twoPassesOneSide: Das transparente Objekt wird zuerst im Tiefenpuffer gerendert, dann noch einmal im Farbpuffer, wobei der cullling-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 mit doubleSided kombiniert werden, um eine bessere Wirkung zu erzielen.

material {
    transparency : twoPassesOneSide
}

maskThreshold

Typ
number
Wert
Ein Wert zwischen 0.0 und 1.0. Die Standardeinstellung ist 0.4.
Beschreibung
Legt den minimalen Alphawert fest, der ein Fragment nicht verworfen werden muss, wenn der Modus blending auf masked gesetzt ist. Wenn der Mischmodus nicht masked 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 oder false. Die Standardeinstellung ist false.
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 oder skinning.
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 eines unlit-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.