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
Fiziksel tabanlı işleme (Physically Based Rendering, PBR), görüntü oluştururken ışığın yüzeylerle etkileşimini gerçek dünyadaki fizik ilkelerini kullanarak modelleyen bir gölgelendirme yaklaşımıdır. Farklı ortamlarda tutarlı, gerçekçi aydınlatma sağlar ve varlıkların (asset) çok çeşitli aydınlatma koşullarında doğru görünmesini mümkün kılar.
Defold’un PBR uygulaması, glTF 2.0 materyal (material) belirtimini ve ilgili Khronos uzantılarını izler. glTF varlıklarını Defold’a içe aktardığınızda materyal özellikleri otomatik olarak ayrıştırılır ve çalışma sırasında gölgelendiricilerden (shader) erişilebilen yapılandırılmış materyal verileri olarak saklanır.
PBR materyalleri metalik yansımalar, yüzey pürüzlülüğü, ışık geçirimi, saydam kaplama, yüzey altı saçılma, yanardönerlik gibi etkiler ve daha fazlasını içerebilir.
Defold şu anda PBR materyal verilerini gölgelendiricilere sunar, ancak yerleşik bir PBR aydınlatma modeli sağlamaz. Fiziksel tabanlı işleme elde etmek için bu verileri kendi aydınlatma ve yansıma gölgelendiricilerinizde kullanabilirsiniz. Defold’a ileride varsayılan bir PBR aydınlatma modeli eklenecektir.
glTF dosyalarındaki gömülü dokular (texture) şu anda Defold’da otomatik olarak atanmaz. Gölgelendiricilere yalnızca materyal parametreleri sunulur. Yine de dokuları model bileşenlerine (model component) elle atayabilir ve gölgelendiricinizde bunlardan örnekleme yapabilirsiniz.
Materyal özellikleri, bir model bileşenine atanan glTF 2.0 kaynak dosyalarından ayrıştırılır. Özelliklerin tümü standart değildir. Bazıları isteğe bağlı glTF uzantıları aracılığıyla sağlanır; glTF dosyasını dışa aktarmak için kullanılan araç bu uzantıları dosyaya dahil edebilir veya etmeyebilir. İlgili uzantı aşağıda özellik adından sonra parantez içinde belirtilmiştir.
Bu özelliklerden bazıları, materyalin nasıl işlenmesi gerektiğine ilişkin ipuçları sağlar. Bu özelliklerin (alfa kesme eşiği, alfa modu, çift taraflı ve aydınlatmasız) verilerine gölgelendiricilerden erişilebilir, ancak bu veriler materyalin Defold’da nasıl işlendiğini etkilemez.
PBR materyal verileri, türlere ve adlandırma kuralına göre gölgelendiricilere sunulur. PBR materyal sistemi, ayrıştırılan tüm materyal parametrelerini PbrMaterial adlı yapılandırılmış bir uniform bloğu aracılığıyla gölgelendiricilere sağlar. Desteklenen her glTF uzantısı, bu blok içinde #define bayrakları kullanılarak koşullu olarak derlenebilen bir yapıya (struct) karşılık gelir.
uniform PbrMaterial
{
// Material properties
};
Materyalin çeşitli özellikleri, gölgelendiricide sabit yapılar olarak tanımlanır. Defold’un iç işleyişinde sabitler bu şekilde ayarlandığından, veriler mümkün olduğunca vec4 değerleri içinde bir araya getirilmiştir. Verilerin bu şekilde birleştirildiği durumlar, aşağıda her özelliğe ait gölgelendirici kod parçalarında yorumlarla belirtilmiştir:
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), RGB: attenuationColor
vec4 thicknessFactorAndAttenuationColor;
// R: attentuationDistance (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;
};
Ortak özellikler doğrudan materyalin uniform bloğunda ayarlanır (burada da verilerin vec4 içinde bir araya getirildiğine dikkat edin).
// Common textures
uniform sampler2D PbrMaterial_normalTexture;
uniform sampler2D PbrMaterial_occlusionTexture;
uniform sampler2D PbrMaterial_emissiveTexture;
uniform PbrMaterial
{
// Common properties:
// R: alphaCutoff (Default=0.5), G: doubleSided (Default=false), B: unlit (Default=false)
vec4 pbrAlphaCutoffAndDoubleSidedAndIsUnlit;
// R: use normalTexture, G: use occlusionTexture, B: use emissiveTexture
vec4 pbrCommonTextures;
// Other properties...
};
Aşağıda, tüm özellikleri ve doku bağlamaları için önerilen bir adlandırma şemasını içeren örnek bir gölgelendirici verilmiştir (bu bağlamaların yine elle yapılması gerekir). Aşağıdaki örnekte gösterildiği gibi, PbrMaterial bloğunun her bir üyesinin çevresinde #define kullanarak özellikleri kapatabileceğinizi unutmayın:
// Feature flags, comment or remove these to slim down the shader.
#define PBR_METALLIC_ROUGHNESS
#define PBR_SPECULAR_GLOSSINESS
#define PBR_CLEARCOAT
#define PBR_TRANSMISSION
#define PBR_IOR
#define PBR_SPECULAR
#define PBR_VOLUME
#define PBR_SHEEN
#define PBR_EMISSIVE_STRENGTH
#define PBR_IRIDESCENCE
// Common
uniform sampler2D PbrMaterial_normalTexture;
uniform sampler2D PbrMaterial_occlusionTexture;
uniform sampler2D PbrMaterial_emissiveTexture;
// PbrMetallicRoughness
uniform sampler2D PbrMetallicRoughness_baseColorTexture;
uniform sampler2D PbrMetallicRoughness_metallicRoughnessTexture;
struct PbrMetallicRoughness
{
vec4 baseColorFactor;
// R: metallic (Default=1.0), G: roughness (Default=1.0)
vec4 metallicAndRoughnessFactor;
// R: use baseColorTexture, G: use metallicRoughnessTexture
vec4 metallicRoughnessTextures;
};
// PbrSpecularGlossiness
uniform sampler2D PbrSpecularGlossiness_diffuseTexture;
uniform sampler2D PbrSpecularGlossiness_specularGlossinessTexture;
struct PbrSpecularGlossiness
{
vec4 diffuseFactor;
// RGB: specular (Default=1.0), A: glossiness (Default=1.0)
vec4 specularAndSpecularGlossinessFactor;
// R: use diffuseTexture, G: use specularGlossinessTexture
vec4 specularGlossinessTextures;
};
// PbrClearCoat
uniform sampler2D PbrClearCoat_clearcoatTexture;
uniform sampler2D PbrClearCoat_clearcoatRoughnessTexture;
uniform sampler2D PbrClearCoat_clearcoatNormalTexture;
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;
};
// PbrTransmission
uniform sampler2D PbrTransmission_transmissionTexture;
struct PbrTransmission
{
// R: transmission (Default=0.0)
vec4 transmissionFactor;
// R: use transmissionTexture
vec4 transmissionTextures;
};
struct PbrIor
{
// R: ior (Default=0.0)
vec4 ior;
};
// PbrSpecular
uniform sampler2D PbrSpecular_specularTexture;
uniform sampler2D PbrSpecular_specularColorTexture;
struct PbrSpecular
{
// RGB: specularColor, A: specularFactor (Default=1.0);
vec4 specularColorAndSpecularFactor;
// R: use specularTexture, G: use specularColorTexture
vec4 specularTextures;
};
// PbrVolume
uniform sampler2D PbrVolume_thicknessTexture;
struct PbrVolume
{
// R: thicknessFactor (Default=0.0), RGB: attenuationColor
vec4 thicknessFactorAndAttenuationColor;
// R: attentuationDistance (Default=-1.0)
vec4 attenuationDistance;
// R: use thicknessTexture
vec4 volumeTextures;
};
// PbrSheen
uniform sampler2D PbrSheen_sheenColorTexture;
uniform sampler2D PbrSheen_sheenRoughnessTexture;
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;
};
// PbrIridescence
uniform sampler2D PbrEmissive_iridescenceTexture;
uniform sampler2D PbrEmissive_iridescenceThicknessTexture;
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;
};
uniform PbrMaterial
{
// Common properties
// R: alphaCutoff (Default=0.5), G: doubleSided (Default=false), B: unlit (Default=false)
vec4 pbrAlphaCutoffAndDoubleSidedAndIsUnlit;
// R: use normalTexture, G: use occlusionTexture, B: use emissiveTexture
vec4 pbrCommonTextures;
// Features
#ifdef PBR_METALLIC_ROUGHNESS
PbrMetallicRoughness pbrMetallicRoughness;
#endif
#ifdef PBR_SPECULAR_GLOSSINESS
PbrSpecularGlossiness pbrSpecularGlossiness;
#endif
#ifdef PBR_CLEARCOAT
PbrClearCoat pbrClearCoat;
#endif
#ifdef PBR_TRANSMISSION
PbrTransmission pbrTransmission;
#endif
#ifdef PBR_IOR
PbrIor pbrIor;
#endif
#ifdef PBR_SPECULAR
PbrSpecular pbrSpecular;
#endif
#ifdef PBR_VOLUME
PbrVolume pbrVolume;
#endif
#ifdef PBR_SHEEN
PbrSheen pbrSheen;
#endif
#ifdef PBR_EMISSIVE_STRENGTH
PbrEmissiveStrength pbrEmissiveStrength;
#endif
#ifdef PBR_IRIDESCENCE
PbrIridescence pbrIridescence;
#endif
};
Materyal yapısında belirli veri alanları bulunamazsa bu özelliklere ait veriler ayarlanmaz. Örneğin, materyal yapısında pbrClearCoat yoksa saydam kaplama verisi ayarlanmaz. Uniform bloğu bulunamazsa işleme sırasında hiçbir veri ayarlanmaz.
Her materyal özelliği, Defold’un iç işleyişindeki bir işleme sabitine karşılık gelir. pbrFeature.structMember adlandırma kalıbını izleyerek doğrudan materyal kaynağında sabitler tanımlayabilir ve varsayılan değerleri geçersiz kılabilirsiniz. glTF materyalinde karşılık gelen veriler eksikse bu değerler otomatik olarak uygulanır.

Materyal verilerini fiziksel tabanlı aydınlatma için kullanmak üzere, PbrMaterial bloğunda sağlanan parametreleri kullanarak parça gölgelendiricinizde bir BRDF uygulayın.
Ayrıca bakınız: