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
Physically Based Rendering (PBR), ou renderização fisicamente baseada, é uma abordagem de sombreamento que modela como a luz interage com superfícies usando princípios físicos do mundo real. Ela produz iluminação consistente e realista em diferentes ambientes e permite que assets pareçam corretos sob uma ampla variedade de condições de iluminação.
A implementação de PBR do Defold segue a especificação de material glTF 2.0 e extensões Khronos associadas. Quando você importa assets glTF para o Defold, as propriedades de material são analisadas automaticamente e armazenadas como dados estruturados de material que podem ser acessados em shaders em tempo de execução.
Materiais PBR podem incluir efeitos como reflexos metálicos, rugosidade de superfície, transmissão, clearcoat, espalhamento subsuperficial, iridescência e outros.
Atualmente, o Defold expõe dados de material PBR para shaders, mas não fornece um modelo de iluminação PBR integrado. Você pode usar esses dados nos seus próprios shaders de iluminação e reflexão para obter renderização fisicamente baseada. Um modelo padrão de iluminação PBR será adicionado ao Defold em uma etapa posterior.
Texturas embutidas de arquivos glTF atualmente não são atribuídas automaticamente no Defold. Apenas parâmetros de material são expostos aos shaders. Você ainda pode atribuir texturas manualmente a componentes de modelo e amostrá-las no seu shader.
As propriedades de material são analisadas a partir dos arquivos-fonte glTF 2.0 atribuídos a um componente de modelo. Nem todas as propriedades são padrão. Algumas são fornecidas por extensões glTF opcionais que podem ou não ser incluídas pela ferramenta usada para exportar o arquivo glTF. A extensão relevante é indicada entre parênteses após o nome da propriedade abaixo.
Algumas dessas propriedades fornecem indicações sobre como o material deve ser renderizado. Os dados das propriedades (alpha cutoff, alpha mode, double sided e unlit) estão disponíveis nos shaders, mas não afetam como o material é renderizado no Defold.
Os dados de material PBR são expostos aos shaders com base nos tipos e na convenção de nomes. O sistema de material PBR fornece todos os parâmetros de material analisados aos shaders por meio de um bloco uniforme estruturado chamado PbrMaterial. Cada extensão glTF suportada corresponde a uma struct dentro desse bloco, que pode ser compilada condicionalmente usando flags #define.
uniform PbrMaterial
{
// Propriedades do material
};
Os vários recursos do material são especificados como structs fixas no shader. Os dados foram compactados tanto quanto possível em vec4’s, pois é assim que constantes são definidas internamente no Defold. Nos casos em que os dados foram compactados, isso é indicado como comentários nos trechos de shader de cada recurso abaixo:
struct PbrMetallicRoughness
{
vec4 baseColorFactor;
// R: metallic (Padrão=1.0), G: roughness (Padrão=1.0)
vec4 metallicAndRoughnessFactor;
// R: use baseColorTexture, G: use metallicRoughnessTexture
vec4 metallicRoughnessTextures;
};
struct PbrSpecularGlossiness
{
vec4 diffuseFactor;
// RGB: specular (Padrão=1.0), A: glossiness (Padrão=1.0)
vec4 specularAndSpecularGlossinessFactor;
// R: use diffuseTexture, G: use specularGlossinessTexture
vec4 specularGlossinessTextures;
};
struct PbrClearCoat
{
// R: clearCoat (Padrão=0.0), G: clearCoatRoughness (Padrão=0.0)
vec4 clearCoatAndClearCoatRoughnessFactor;
// R: use clearCoatTexture, G: use clearCoatRoughnessTexture, B: use clearCoatNormalTexture
vec4 clearCoatTextures;
};
struct PbrTransmission
{
// R: transmission (Padrão=0.0)
vec4 transmissionFactor;
// R: use transmissionTexture
vec4 transmissionTextures;
};
struct PbrIor
{
// R: ior (Padrão=0.0)
vec4 ior;
};
struct PbrSpecular
{
// RGB: specularColor, A: specularFactor (Padrão=1.0);
vec4 specularColorAndSpecularFactor;
// R: use specularTexture, G: use specularColorTexture
vec4 specularTextures;
};
struct PbrVolume
{
// R: thicknessFactor (Padrão=0.0), RGB: attenuationColor
vec4 thicknessFactorAndAttenuationColor;
// R: attentuationDistance (Padrão=-1.0)
vec4 attenuationDistance;
// R: use thicknessTexture
vec4 volumeTextures;
};
struct PbrSheen
{
// RGB: sheenColor, A: sheenRoughnessFactor (Padrão=0.0)
vec4 sheenColorAndRoughnessFactor;
// R: use sheenColorTexture, G: use sheenRoughnessTexture
vec4 sheenTextures;
};
struct PbrEmissiveStrength
{
// R: emissiveStrength (Padrão=1.0)
vec4 emissiveStrength;
};
struct PbrIridescence
{
// R: iridescenceFactor (Padrão=0.0), G: iridescenceIor (Padrão=1.3), B: iridescenceThicknessMin (Padrão=100.0), A: iridescenceThicknessMax (Padrão=400.0)
vec4 iridescenceFactorAndIorAndThicknessMinMax;
// R: use iridescenceTexture, G: use iridescenceThicknessTexture
vec4 iridescenceTextures;
};
As propriedades comuns são definidas no próprio uniform do material (e, mais uma vez, observe a compactação de dados em vec4).
// Texturas comuns
uniform sampler2D PbrMaterial_normalTexture;
uniform sampler2D PbrMaterial_occlusionTexture;
uniform sampler2D PbrMaterial_emissiveTexture;
uniform PbrMaterial
{
// Propriedades comuns:
// R: alphaCutoff (Padrão=0.5), G: doubleSided (Padrão=false), B: unlit (Padrão=false)
vec4 pbrAlphaCutoffAndDoubleSidedAndIsUnlit;
// R: use normalTexture, G: use occlusionTexture, B: use emissiveTexture
vec4 pbrCommonTextures;
// Outras propriedades...
};
Aqui está um shader de exemplo que contém todos os recursos e um esquema de nomes proposto para bindings de textura (novamente, isso deve ser tratado manualmente). Observe que você pode desativar recursos simplesmente usando defines ao redor de cada membro do próprio PbrMaterial, como mostrado no exemplo abaixo:
// Flags de recursos; comente ou remova para reduzir o 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
// Comum
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 (Padrão=1.0), G: roughness (Padrão=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 (Padrão=1.0), A: glossiness (Padrão=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 (Padrão=0.0), G: clearCoatRoughness (Padrão=0.0)
vec4 clearCoatAndClearCoatRoughnessFactor;
// R: use clearCoatTexture, G: use clearCoatRoughnessTexture, B: use clearCoatNormalTexture
vec4 clearCoatTextures;
};
// PbrTransmission
uniform sampler2D PbrTransmission_transmissionTexture;
struct PbrTransmission
{
// R: transmission (Padrão=0.0)
vec4 transmissionFactor;
// R: use transmissionTexture
vec4 transmissionTextures;
};
struct PbrIor
{
// R: ior (Padrão=0.0)
vec4 ior;
};
// PbrSpecular
uniform sampler2D PbrSpecular_specularTexture;
uniform sampler2D PbrSpecular_specularColorTexture;
struct PbrSpecular
{
// RGB: specularColor, A: specularFactor (Padrão=1.0);
vec4 specularColorAndSpecularFactor;
// R: use specularTexture, G: use specularColorTexture
vec4 specularTextures;
};
// PbrVolume
uniform sampler2D PbrVolume_thicknessTexture;
struct PbrVolume
{
// R: thicknessFactor (Padrão=0.0), RGB: attenuationColor
vec4 thicknessFactorAndAttenuationColor;
// R: attentuationDistance (Padrão=-1.0)
vec4 attenuationDistance;
// R: use thicknessTexture
vec4 volumeTextures;
};
// PbrSheen
uniform sampler2D PbrSheen_sheenColorTexture;
uniform sampler2D PbrSheen_sheenRoughnessTexture;
struct PbrSheen
{
// RGB: sheenColor, A: sheenRoughnessFactor (Padrão=0.0)
vec4 sheenColorAndRoughnessFactor;
// R: use sheenColorTexture, G: use sheenRoughnessTexture
vec4 sheenTextures;
};
struct PbrEmissiveStrength
{
// R: emissiveStrength (Padrão=1.0)
vec4 emissiveStrength;
};
// PbrIridescence
uniform sampler2D PbrEmissive_iridescenceTexture;
uniform sampler2D PbrEmissive_iridescenceThicknessTexture;
struct PbrIridescence
{
// R: iridescenceFactor (Padrão=0.0), G: iridescenceIor (Padrão=1.3), B: iridescenceThicknessMin (Padrão=100.0), A: iridescenceThicknessMax (Padrão=400.0)
vec4 iridescenceFactorAndIorAndThicknessMinMax;
// R: use iridescenceTexture, G: use iridescenceThicknessTexture
vec4 iridescenceTextures;
};
uniform PbrMaterial
{
// Propriedades comuns
// R: alphaCutoff (Padrão=0.5), G: doubleSided (Padrão=false), B: unlit (Padrão=false)
vec4 pbrAlphaCutoffAndDoubleSidedAndIsUnlit;
// R: use normalTexture, G: use occlusionTexture, B: use emissiveTexture
vec4 pbrCommonTextures;
// Recursos
#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
};
Se pontos de dados específicos na struct de material não forem encontrados, os dados desses recursos não serão definidos. Por exemplo, se não houver pbrClearCoat na struct de material, nenhum dado de clear coat será definido. Se o bloco uniform não for encontrado, nenhum dado será definido durante a renderização.
Cada propriedade de material corresponde a uma constante interna de renderização no Defold. Você pode sobrescrever valores padrão definindo constantes no próprio recurso de material, seguindo o padrão de nomenclatura pbrFeature.structMember. Esses valores serão aplicados automaticamente se os dados correspondentes estiverem ausentes no material glTF.

Para usar os dados de material em iluminação fisicamente baseada, implemente uma BRDF no seu fragment shader usando os parâmetros fornecidos no bloco PbrMaterial.
Veja também: