This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Physikalisch basiertes Rendering (Physically Based Rendering, PBR) ist ein Schattierungsansatz, der die Wechselwirkung zwischen Licht und Oberflächen anhand physikalischer Prinzipien modelliert. Materialeigenschaften wie Grundfarbe, Metallfaktor und Rauheit beschreiben die Oberfläche unabhängig von der Beleuchtung der Szene.
Integrierte glTF-Materialien bieten PBR-Beleuchtung. Defold stellt benutzerdefinierten Shadern außerdem importierte glTF-2.0-Materialeigenschaften und unterstützte Khronos-Erweiterungsdaten bereit.
Weise der Eigenschaft Scene einer Modellkomponente eine glTF- oder GLB-Datei zu. Wenn der Editor anbietet, Materialien und Texturen auszufüllen, wähle Auto Fill, um die erzeugten Materialbindungen der Szene anzuwenden und gegebenenfalls bestehende Bindungen zu ersetzen. Diese Materialien verwenden die integrierten glTF-Shader und können eingebettete Bilder direkt referenzieren. Wähle Keep Current, um deine Bindungen beizubehalten und Materialien und Texturen manuell zuzuweisen. Das Durchsuchen eingebetteter Ressourcen und die Auswahl einzelner Meshes beschreibt der Ablauf des Modellimports.
Die folgenden Materialien sind unter /builtins/materials/ verfügbar. Wähle die Variante passend zu deinem Modell und dessen Verwendung von Instanzierung:
| Modelltyp | Material |
|---|---|
| Statisch, nicht instanziert | gltf.material |
| Statisch, instanziert | gltf_instanced.material |
| Mit Skinning (animiert), nicht instanziert | gltf_skinned.material |
| Mit Skinning (animiert), instanziert | gltf_skinned_instanced.material |
Alle vier verwenden lokalen Vertex-Raum und denselben Fragment-Shader gltf.fp. Die Skinning-Varianten führen das Skinning auf der GPU aus. Siehe die Anforderungen an Modellmaterialien für GPU-Skinning und Instanzierung.
Für manuelle Texturbindungen verwenden die integrierten Materialien folgende Samplernamen:
| Textur | Sampler | Verwendete Daten |
|---|---|---|
| Grundfarbe | PbrMetallicRoughness_baseColorTexture |
RGB-Farbe und Alpha |
| Metall/Rauheit | PbrMetallicRoughness_metallicRoughnessTexture |
Rauheit in G, Metall in B |
| Normalen | PbrMaterial_normalTexture |
Normale im Tangentenraum in RGB |
| Verdeckung | PbrMaterial_occlusionTexture |
Verdeckung in R |
| Emission | PbrMaterial_emissiveTexture |
RGB-Farbe |
Richte eine Kamera ein und füge Lichtkomponenten hinzu, um das Modell zu beleuchten. Der Shader verwendet gerichtete Lichtquellen, Punkt- und Spotlichter für direkte Beleuchtung sowie Umgebungslichtquellen für einen einfachen Umgebungsanteil. Die Materialien besitzen das Tag model, das vom Standard-Renderskript gezeichnet wird. Ein eigenes Renderskript muss ein passendes Prädikat zeichnen.
Die integrierten Shader implementieren Metallic-/Roughness-Schattierung, Grund- und Vertex-Farbe, Normal Mapping bei verfügbaren Tangentendaten, Verdeckung und Emission einschließlich Emissionsstärke. Grundfarben- und Emissionstexturen werden für die Beleuchtung aus sRGB dekodiert, die Endfarbe wird zurück nach sRGB konvertiert. Metallic-/Roughness-, Normalen- und Verdeckungstexturen enthalten lineare Daten.
Der Shader berücksichtigt unbeleuchtete Materialien und maskiertes Alpha und passt Normalen für doppelseitige Oberflächen an. Der Renderzustand bleibt wichtig:
graphics.BLEND_FACTOR_SRC_ALPHA und graphics.BLEND_FACTOR_ONE_MINUS_SRC_ALPHA und verwalte Zeichenreihenfolge und Tiefenschreibzugriffe transparenter Objekte im Renderskript. Der standardmäßige Model-Durchlauf aktiviert Blending nicht automatisch.Der integrierte Umgebungsanteil ist eine Näherung ohne Environment-Map-Beleuchtung oder Schatten. Effekte wie Klarlack, Transmission, Sheen, Irisieren und der Specular-/Glossiness-Workflow benötigen eigene Schattierung; der Import ihrer Parameter aktiviert diese Effekte nicht in gltf.fp.
Die folgenden Eigenschaften werden aus glTF-2.0-Quelldateien eingelesen, die einer Modellkomponente zugewiesen sind. Diese Liste beschreibt die verfügbaren Materialdaten; die integrierte Beleuchtung verwendet die oben beschriebene Teilmenge. Nicht alle Eigenschaften gehören zum Standard. Einige stammen aus optionalen glTF-Erweiterungen, die das zum Export verwendete Werkzeug möglicherweise einbezieht. Die jeweilige Erweiterung steht unten in Klammern hinter dem Eigenschaftsnamen.
Die folgenden Abschnitte behandeln benutzerdefinierte Shader. Kopiere die passende integrierte .material-Ressource und gltf.fp in dein Projekt und setze Fragment Program des kopierten Materials auf deinen Shader. Behalte das passende glTF-Vertex-Programm, die Samplernamen und lokalen Vertex-Raum bei, sofern du nicht auch diese Schnittstellen ersetzt.
Die integrierten Hilfsfunktionen trennen Texturabtastung von Oberflächenvorbereitung, BRDF-Berechnungen und Beleuchtung. gltf_sampling.glsl liest den rohen Uniform-Block PbrMaterial und erzeugt einen Wert vom Typ PBRMaterial mit aufgelösten, linearen Materialeingaben. gltf_lighting.glsl stellt direkte und Umgebungsbeleuchtung bereit und kombiniert deren Beiträge. Die Großschreibung unterscheidet den rohen Uniform-Block von der Struktur des abgetasteten Materials.
Dieser Fragment-Shader erhöht die Mindestrauheit und behält dabei die integrierte Beleuchtung bei. Er funktioniert mit den Vertex-Programmen aller vier glTF-Materialvarianten:
#version 140
#include "/builtins/materials/gltf_sampling.glsl"
#include "/builtins/materials/gltf_lighting.glsl"
out vec4 out_fragColor;
void main()
{
PBRMaterial inputs = pbr_sample_material(var_texcoord0, var_color);
inputs.roughness = max(inputs.roughness, 0.35);
// Sample textures, including the normal map, before discarding fragments.
PBRSurface surface = pbr_sample_surface(inputs, var_texcoord0);
if ((!inputs.doubleSided && !gl_FrontFacing) || pbr_should_discard_alpha(inputs))
{
discard;
}
// Derive BRDF values after editing the material inputs.
MaterialInfo material = pbr_create_material_info(inputs);
PBRLighting lighting = pbr_create_lighting();
if (!inputs.unlit)
{
lighting.direct = pbr_evaluate_direct_lighting(material, surface, var_view);
lighting.indirect = pbr_evaluate_ambient_lighting(material, ambient_light());
}
vec3 color = pbr_compose_lighting(inputs, lighting, inputs.occlusion, inputs.occlusion);
out_fragColor = vec4(pbr_linear_to_srgb(color), pbr_get_alpha(inputs));
}
Bearbeite abgetastete Materialeingaben vor dem Aufruf von pbr_create_material_info(). Wenn du die Position im Ansichtsraum oder die Normalen einer Oberfläche änderst, rufe pbr_finalize_surface(surface, var_view) auf, um ihre abgeleiteten Felder im Weltraum zu aktualisieren. Verwende oder ersetze für eine eigene BRDF oder einzelne Lichtbeiträge pbr_evaluate_brdf() und pbr_evaluate_light() aus den integrierten Hilfsfunktionen.
Du kannst lighting.indirect durch eigene Umgebungsbeleuchtung oder globale Beleuchtung ersetzen. Seine diffusen und spiegelnden Beiträge sind lineares ausgehendes Licht; wende die BRDF des Materials daher kein zweites Mal an. Wende Schattensichtbarkeit auf den entsprechenden direkten Lichtbeitrag an; die Sichtbarkeitsargumente von pbr_compose_lighting() beeinflussen nur indirekte Beleuchtung. Schreibe für eine HDR-Pipeline lineare Farbe in das Zwischenziel und führe die sRGB-Konvertierung im letzten Durchlauf aus.
Deklariere für einen vollständig eigenen Shader einen Uniform-Block namens PbrMaterial mit den erkannten Feldnamen und Typen. Defold füllt passende Felder aus dem glTF-Quellmaterial. Die folgenden Deklarationen beschreiben die verfügbaren Funktionsstrukturen; beziehe nur diejenigen ein, die dein Shader benötigt. Die Deklaration einer Struktur stellt Daten bereit, ihr Abtast- und Beleuchtungsverhalten muss dein Shader jedoch implementieren.
Deklariere den Uniform-Block oder PbrMetallicRoughness nicht erneut, wenn du gltf_sampling.glsl einbindest, da sie dort bereits deklariert sind. Die folgenden Deklarationen sind eine Alternative für Shader, die ihre Materialeingaben selbst verwalten.
struct PbrMetallicRoughness
{
vec4 baseColorFactor;
// R: metallic (Default=1.0), G: roughness (Default=1.0)
vec4 metallicAndRoughnessFactor;
// R: use baseColorTexture, G: use metallicRoughnessTexture
vec4 metallicRoughnessTextures;
};
struct PbrSpecularGlossiness
{
vec4 diffuseFactor;
// RGB: specular (Default=1.0), A: glossiness (Default=1.0)
vec4 specularAndSpecularGlossinessFactor;
// R: use diffuseTexture, G: use specularGlossinessTexture
vec4 specularGlossinessTextures;
};
struct PbrClearCoat
{
// R: clearCoat (Default=0.0), G: clearCoatRoughness (Default=0.0)
vec4 clearCoatAndClearCoatRoughnessFactor;
// R: use clearCoatTexture, G: use clearCoatRoughnessTexture, B: use clearCoatNormalTexture
vec4 clearCoatTextures;
};
struct PbrTransmission
{
// R: transmission (Default=0.0)
vec4 transmissionFactor;
// R: use transmissionTexture
vec4 transmissionTextures;
};
struct PbrIor
{
// R: ior (Default=0.0)
vec4 ior;
};
struct PbrSpecular
{
// RGB: specularColor, A: specularFactor (Default=1.0);
vec4 specularColorAndSpecularFactor;
// R: use specularTexture, G: use specularColorTexture
vec4 specularTextures;
};
struct PbrVolume
{
// R: thicknessFactor (Default=0.0), GBA: attenuationColor
vec4 thicknessFactorAndAttenuationColor;
// R: attenuationDistance (Default=-1.0)
vec4 attenuationDistance;
// R: use thicknessTexture
vec4 volumeTextures;
};
struct PbrSheen
{
// RGB: sheenColor, A: sheenRoughnessFactor (Default=0.0)
vec4 sheenColorAndRoughnessFactor;
// R: use sheenColorTexture, G: use sheenRoughnessTexture
vec4 sheenTextures;
};
struct PbrEmissiveStrength
{
// R: emissiveStrength (Default=1.0)
vec4 emissiveStrength;
};
struct PbrIridescence
{
// R: iridescenceFactor (Default=0.0), G: iridescenceIor (Default=1.3), B: iridescenceThicknessMin (Default=100.0), A: iridescenceThicknessMax (Default=400.0)
vec4 iridescenceFactorAndIorAndThicknessMinMax;
// R: use iridescenceTexture, G: use iridescenceThicknessTexture
vec4 iridescenceTextures;
};
Die gemeinsamen Eigenschaften und Funktionsstrukturen sind Mitglieder des Uniform-Blocks. Die gepackten Komponenten sind:
uniform PbrMaterial
{
// X: alpha cutoff, Y: double-sided, Z: unlit,
// W: alpha mode (0 = opaque, 1 = mask, 2 = blend)
vec4 pbrAlphaCutoffAndDoubleSidedAndIsUnlit;
// X: has normal texture, Y: has occlusion texture, Z: has emissive texture
vec4 pbrCommonTextures;
// RGB: emissive factor, W: emissive strength
vec4 pbrEmissiveFactorAndStrength;
// X: normal scale, Y: occlusion strength
vec4 pbrNormalScaleAndOcclusionStrength;
PbrMetallicRoughness pbrMetallicRoughness;
PbrSpecularGlossiness pbrSpecularGlossiness;
PbrClearCoat pbrClearCoat;
PbrTransmission pbrTransmission;
PbrIor pbrIor;
PbrSpecular pbrSpecular;
PbrVolume pbrVolume;
PbrSheen pbrSheen;
PbrEmissiveStrength pbrEmissiveStrength;
PbrIridescence pbrIridescence;
};
Lasse ungenutzte Funktionsmitglieder aus dem Block weg. Fehlen der Block oder die erkannten Felder einer Funktion, werden die entsprechenden Daten nicht bereitgestellt. Flags zum Vorhandensein von Texturen beschreiben die Texturreferenzen des Quellmaterials; ein eigenes Material benötigt weiterhin passende Samplerdeklarationen und Texturbindungen für die abgetasteten Texturen.
Funktionsfelder verwenden Namen wie pbrMetallicRoughness.baseColorFactor; gemeinsame Felder verwenden Namen wie pbrEmissiveFactorAndStrength. Die Engine befüllt diese Konstanten aus dem importierten Material oder aus einem Standardmaterial, wenn das Modell keine Materialdaten besitzt. Standardwerte in der .material-Ressource überschreiben die importierten Werte nicht.
Um die integrierte Schattierung anzupassen, bearbeite das abgetastete PBRMaterial vor der Ableitung seiner BRDF-Werte, wie im obigen Beispiel. Deklariere für zusätzliche Steuerungsmöglichkeiten zur Laufzeit eigene Shader-Konstanten und verwende die API für Modellmaterialkonstanten.
Verwende die integrierten Materialien für den standardmäßigen glTF-Metallic-/Roughness-Workflow. Erweitere die Shader-Hilfsfunktionen oder stelle ein eigenes Material bereit, wenn du eine andere BRDF, Umgebungsbeleuchtung, Schatten oder zusätzliche glTF-Materialeffekte benötigst.
Siehe auch: