# Materials

Os materiais são incorporados em um *.gltf* ou *.glb* arquivo.

Este documento refere-se a materiais que são importados em um modelo 3D. Para materiais definidos via código para aplicar em formas primitivas, veja [**materials**](https://docs.decentraland.org/creator/development-guide/materials/) .

{% hint style="warning" %}
**📔 Nota**: Você não pode atualmente alterar dinamicamente os materiais de um modelo 3D a partir do código da sua cena, a menos que seja uma forma primitiva.
{% endhint %}

## Suporte a Shader

Nem todos os shaders podem ser usados em modelos que são importados para Decentraland. Certifique-se de usar um dos seguintes:

* **Materiais padrão:** qualquer shader é suportado, por exemplo diffuse, specular, transparency, etc.
* **Materiais PBR (Physically Based Rendering)**: Este shader é mais flexível, pois inclui propriedades como diffuse, roughness, metalness e emission que permitem configurar como um material interage com a luz.

A imagem abaixo mostra dois modelos idênticos, criados com as mesmas cores e texturas. O modelo à esquerda usa todos os *PBR* materiais, alguns deles incluem *metalness*, *transparency*, e *emissiveness*. O modelo à direita usa todos os *standard* materiais, alguns incluindo *transparency* e *emissiveness*.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-738840e87d1016d69373d87362184c128540bb34%2F30-materials.png?alt=media)

### Propriedades PBR que atualmente funcionam com o Decentraland Engine

> * Base Color
> * Metallic
> * Roughness
> * Specular
> * Emissive
> * Emission Strength
> * Alpha
> * Normal

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-4f7c30911e7f3f423d3bf4232caf391c4f3c21ea%2F60-principledBSDF.png?alt=media)

Para visualizar como essas propriedades se comportam no mundo você pode ir para este [testing world](decentraland://?realm=TestEnvironment.dcl.eth) para encontrar diferentes objetos e materiais e como eles interagem com luzes e ambiente do mundo.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-59533ef54ae1e8b023b1aac7c29c2e946bee5c6c%2F55-testing-environment.png?alt=media)

### Base/Diffuse Color

Define a cor base da superfície do objeto. Por si só não sofre qualquer influência da iluminação, por isso é combinada com outros nós como roughness, metallic, specular, etc.

### Metallic

Um shader metallic refere-se a um tipo de técnica de renderização usada para simular a aparência de superfícies metálicas. Um shader metallic leva em conta as propriedades físicas dos metais e como eles interagem com a luz para produzir as qualidades características brilhantes e reflexivas do metal.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-72df7dbe44a99add0601d2210ac6c8158cec7bd1%2F61-metallic-material.png?alt=media)

### Roughness

Materiais de roughness estão relacionados à simulação realista de como a luz interage com a superfície do material. Normalmente mapas de roughness são usados para dar aos modelos uma faixa de "suavidade" ou "rugosidade" em suas superfícies. Normalmente usa-se um mapa de textura em tons de cinza para fornecer esse tipo de informação.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-9b8a24c451b1e14c95191185dccb686499f8a4ac%2F63-roughness.png?alt=media)

Esta propriedade faz uma mistura entre um modelo de material não metálico e metálico. Um valor de 1.0 dá uma reflexão totalmente specular tingida com a cor base, sem reflexão difusa ou transmissão. Em 0.0 o material consiste em uma camada base difusa ou transmissiva, com uma camada de reflexão specular por cima.

### Specular

Em um shader PBR (Physically-Based Rendering), as propriedades specular referem-se a como a luz interage com uma superfície em termos de sua refletividade e brilho. A reflexão specular é a reflexão em espelho da luz sobre uma superfície. No PBR, essa propriedade é usada para controlar quanto a superfície reflete a luz de forma espelhada. Materiais como metais tipicamente têm alta reflexão specular, criando destaques nítidos e brilhantes, enquanto materiais não metálicos como plásticos têm reflexão specular mais baixa, resultando em destaques mais amplos e suaves.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-912bbeaffb8c4725d9f60b946fc7fe5775df37bb%2F62-specular.png?alt=media)

### Alpha

Você pode definir um material como *transparent*. Materiais transparentes podem ser vistos através em graus variados, dependendo do seu *alpha*. Para fazer isso, ative a propriedade de transparência do material e então defina seu *alpha* para a quantidade desejada. Um alpha de 1 tornará o material completamente opaco, um alpha de 0 o tornará invisível.

A imagem abaixo mostra dois modelos idênticos criados com materiais standard. O da esquerda usa apenas materiais opacos, o da direita usa materiais tanto transparentes quanto opacos em algumas de suas partes.

{% hint style="warning" %}
💡 Lembre-se que usar materiais transparentes é sempre mais caro em termos de desempenho do que materiais diffuse. Sempre tente manter os materiais transparentes o mais baixo possível.
{% endhint %}

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-694975c9963d924b8da300a18d8a47e2025e1fdb%2F31-transparent-materials.png?alt=media)

Existem dois modos principais de transparência diferentes: *Alpha Clip* e *Alpha Blend*. As principais diferenças são:

* **Alpha Clip:** Alpha Clip renderiza valores absolutos sendo 0 ou 1 dado um limiar de corte (clip threshold) de um valor em escala de cinza. A cor anterior será sobrescrita pela cor da superfície, mas somente se o valor alpha estiver acima do valor Clip Threshold.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-b8eaf93cbe426a7c331301aed0a8da693bae547c%2F33-alpha-clip.png?alt=media)

* **Alpha Blend:** Alpha Blend interpola os valores entre 0 e 1. Você pode usar alpha blending para sobrepor a cor da superfície sobre a cor anterior.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-87bb91f45cccee6600d3251887c7ae629b726336%2F34-alpha-blend.png?alt=media)

{% hint style="warning" %}
**🔥Dica de Otimização🔥** A menos que você especificamente queira ter um nível intermediário de transparência, **é sempre mais performático para renderização usar \_Alpha Clip***\*\* em vez de \*\****Alpha Blend**\_**.**
{% endhint %}

{% hint style="warning" %}
**⚠️ Problemas de Ordenação**

Quando você usa modos de blend transparente no seu jogo, é crucial considerar a ordem na qual a mistura de cores acontece. Isso porque a cor final de saída pode ser significativamente afetada pela ordem de blend. Atualmente, o engine suporta apenas ordenação por objeto, o que significa que ele automaticamente ordena todas as superfícies transparentes com base na origem do objeto. No entanto, ordenação por fragmento (pixel) e por triângulo não são atualmente suportadas.

Para evitar problemas relacionados à ordenação, é melhor evitar usar objetos com alpha clip e alpha blend na mesma malha. Isso pode ajudar a prevenir artefatos de blend inesperados e garantir que seu jogo tenha a melhor aparência possível.
{% endhint %}

### Emissive

Você também pode tornar um material *emissive*. Materiais emissive emitem sua própria luz. Observe que quando renderizados, eles não iluminam realmente objetos próximos na cena, apenas parecem ter um brilho borrado ao redor.

A imagem abaixo mostra dois modelos idênticos criados com materiais standard. O da direita tem materiais emissive brilhantes em algumas de suas superfícies.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-116cf9169c3fda356bf068bd4cab46462e0828fe%2F34-emissive-materials.png?alt=media) ![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-bdb40cfa388909cc3ada13c89fff4b3aa9b5f46e%2F35-emissive-nodes.png?alt=media)

*Para tornar um material emissive no Blender, simplesmente adicione um `emission` shader ao material.*

### Emissive Strenght

Força da luz emitida. Um valor de 1.0 garantirá que o objeto na imagem tenha exatamente a mesma cor que a Emission Color, ou seja, torná-lo 'shadeless'.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-d7442e553d308821f6f2069fced7e8139a562396%2F52-emissive-materials.png?alt=media)

*Você pode checar no* [*testing world*](decentraland://?realm=TestEnvironment.dcl.eth) *como o emission strenght se comporta no mundo*

### Normal

O nó "normal" em um shader PBR é um componente fundamental usado para controlar as normais de superfície de um material. Normais são vetores que definem a direção perpendicular a uma superfície em um ponto específico, e desempenham um papel crucial em determinar como a luz interage com a superfície.

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-13d87ebefb8dbb8b4ddc2d72b2d6d3db7181872f%2F50-normal.gif?alt=media)

## Vertex Painting

Pintura de vértices (vertex painting) de modelos 3D não é atualmente suportada pelo engine do Decentraland.

## Limitações de Material

Tenha em conta que os limites de materiais por parcel são:

> log2(n+1) x 20 Quantidade de materiais na cena. Inclui materiais importados como parte de modelos.

É importante considerar que cada material representa uma draw call por objeto, então é crucial manter os materiais no mínimo possível e tentar reutilizar materiais tanto quanto possível usando técnicas como Texture Atlases; isso também beneficiará a cena tendo um estilo coeso entre os assets da sua cena.

## Nomeação de Materiais

Para ter um pipeline de arte organizado e saudável recomendamos nomear seus materiais adequadamente. Uma forma de fazer isso é usar este método de convenção.

```
<Object>_<Classification>_<Sub-Classification(optional)>_<_MAT>
```

Então, por exemplo, digamos que fizemos 2 árvores diferentes, uma que é emissive e brilhante para a primavera e outra fria e metálica para o inverno. Poderíamos nomear os materiais: *"TreeSpring\_Emissive\_MAT"* e outra *"TreeWinter\_Metallic\_MAT"*

Em conclusão,

* 🟢 **Prefira** usar nomes começando com o objeto e a classificação: *"Wood\_Oak\_MAT"*, *"SciFiFence\_Metallic\_MAT"*, etc.
* 🔴 **Evite** usar nomes como *"Material009"*, *"material1"*, o que torna a cena e os modelos realmente difíceis de rastrear e analisar.

## Substituir materiais glTF

Você pode sobrescrever os materiais de um *arquivo glTF* model por meio do uso do [GltfNodeModifiers](https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/essenciais-de-conteudo-3d/materials#modify-gltf-materials) componente no código da sua cena. Veja [Modify glTF materials](https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/essenciais-de-conteudo-3d/materials#modify-gltf-materials) para mais detalhes.

## Melhores Práticas para Materiais

* Se sua cena inclui múltiplos modelos que usam a mesma textura, referencie a textura como um arquivo externo em vez de tê-la incorporada no modelo 3D.

Texturas incorporadas são duplicadas para cada modelo e aumentam o tamanho da cena. *.glb* arquivos têm suas texturas incorporadas por padrão, mas você pode usar [**glTF pipeline**](https://github.com/AnalyticalGraphicsInc/gltf-pipeline) para extraí-la para fora.

> Nota: Após referenciar um arquivo para uma textura que não será incorporada, certifique-se de que esse arquivo não será movido ou renomeado, caso contrário a referência ao arquivo será perdida. O arquivo também deve estar dentro da pasta da cena para que seja enviado junto com a cena.

* Ao definir a transparência de um material, tente sempre usar *Alpha clip* em vez de *Alpha blend*, a menos que você precise especificamente ter um material parcialmente transparente (como vidro). Isso evitará problemas onde o engine renderiza o modelo errado na frente do outro.
* Como regra prática, lembre-se de sempre definir *backface culling* em seus materiais. Isso tornará sua cena mais performante, já que o engine irá renderizar apenas a face visível dos seus modelos. Apenas desmarque *backface culling* caso você precise que um modelo seja renderizado em ambos os lados (por exemplo, um conjunto de folhas de uma árvore feito por planos 3D).

![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-8039927ba106b4fd2df524ed0986d877aca0a70e%2F59-backface-culling.png?alt=media)

* Use as [**default textures**](https://github.com/decentraland/builder-assets/tree/master/textures) do Decentraland, que são pré-carregadas pelos players, fazendo com que seus assets renderizem muito mais rápido.
* Leia [**este artigo**](https://www.khronos.org/blog/art-pipeline-for-gltf) para uma visão detalhada de um pipeline de arte completo que usa texturas PBR em modelos glTF.
* Você pode encontrar uma referência detalhada sobre como criar materiais compatíveis com glTF no Blender em [**Blender’s documentation**](https://docs.blender.org/manual/en/latest/addons/import_export/scene_gltf2.html) .
* Encontre texturas PBR gratuitas e de alta qualidade em [**cgbookcase**](https://cgbookcase.com/) .
