A instanciação de material no Unreal Engine é usada para alterar a aparência de um material sem incorrer em uma recompilação dispendiosa do material.
Considerando que um material típico não pode ser alterado sem recompilação (algo que deve acontecer antes do jogo), um material parametrizado pode ser editado em uma instância de material sem tal recompilação. Isso tem inúmeras vantagens de fluxo de trabalho e pode melhorar o desempenho do material.
Uma instância de material aberta no Editor de instância de material. Você pode personalizar os atributos listados em Grupos de parâmetros nessa interface.
Certos tipos de materiais instanciados podem até mudar durante o jogo em resposta a eventos do jogo (como uma árvore cujo material escurece e carboniza enquanto queima). Isso permite uma enorme flexibilidade visual nos seus elementos artísticos.
Herança de material
O relacionamento entre materiais e instâncias de material é um relacionamento hierárquico de pai/filho. Uma instância de material herda todos os seus atributos do material pai (ou mestre). Por exemplo, este é o gráfico de material para um dos adereços de cadeira encontrados no conteúdo inicial:
Qualquer instância de material criada a partir de M_Chair herda todos os atributos do gráfico mostrado acima.
Observe as convenções de nomenclatura usadas acima. Essa é uma boa prática a ser adotada para que você possa identificar facilmente os Materiais pai e as instâncias de material no Navegador de Conteúdo.
O prefixo M_ indica um material principal, como em M_Chair.
O prefixo MI_ indica uma instância de material, como nos dois exemplos ilustrados à direita.
Como herdam seus atributos do pai, as instâncias de material recém-criadas parecem idênticas ao material pai quando aplicadas a objetos no nível. Na imagem abaixo, a cadeira mais à esquerda tem o material pai aplicado, enquanto as cadeiras do centro e da direita usam instâncias de material inalteradas.
O principal benefício do fluxo de trabalho de instâncias de material é que você pode personalizá-las rapidamente no Editor de instância de material sem chegar a editar o gráfico de nós ou recompilar o material.
No vídeo abaixo, as duas instâncias de material são abertas no Navegador de Conteúdo e editadas no Editor de Instâncias de Material. As alterações aparecem na janela de visualização principal imediatamente, enquanto um material padrão pode demorar até um minuto para ser recompilado, dependendo da complexidade.
Parametrização de materiais
É importante saber que você não pode editar todas as características de uma instância de material por padrão. Para tornar os atributos de material editáveis em uma instância, você deve designá-los como parâmetros no material pai. Isso é chamado de parametrização do material.
Um parâmetro é criado como qualquer outro nó de dados no Editor de Material e contém as mesmas informações que sua contraparte não parametrizada.
Por exemplo, uma expressão Constante contém um único valor de ponto flutuante e é frequentemente usada para controlar entradas de material, como Rugosidade e Metálico. A versão parametrizada desse nó é chamada de Parâmetro escalar.
Expressão de material constante (1) e Parâmetro escalar (2).
Observe que o parâmetro escalar também se torna um valor nomeado que serve como um canal para enviar valores de dados para uma instância de material. É importante que você dê a cada parâmetro um nome descritivo exclusivo no painel Detalhes. Selecione o nó no gráfico de material para acessar suas propriedades no painel Detalhes.
No exemplo acima, o nome do parâmetro é Rugosidade e tem um valor padrão de 0,25.
No material parametrizado simples mostrado abaixo, um Parâmetro de vetor é conectado à entrada Cor de base, enquanto Parâmetros escalares são conectados a Metálico e Rugosidade.
Para ilustrar ainda mais a ideia de parametrização, há também um valor constante de 0,5 passado para a entrada Especular.
Quando abertos no Editor de Instância de Material, os três parâmetros são expostos e editáveis, enquanto a constante não é. Os valores que você deseja expor aos artistas devem ser parâmetros, e os valores que você não deseja que ninguém altere devem permanecer constantes.
Os parâmetros para Cor de Base, Metálico e Rugosidade são editáveis no Editor de Instância de Material, enquanto o valor constante não é exposto aos artistas.
Tipos de parâmetros
Parâmetros podem ser usados em qualquer lugar no seu gráfico de material para direcionar uma ampla variedade de efeitos de material.
Alguns dos principais tipos de parâmetros estão documentados abaixo, e uma lista completa de Expressões de parâmetros está disponível aqui.
Parâmetros escalares
Um ScalarParameter é um parâmetro que contém um único valor de ponto flutuante. Parâmetros escalares podem direcionar qualquer efeito com base em valores únicos, como visto nos exemplos de Rugosidade e Metálico acima.
Parâmetros escalares também são frequentemente usados para controlar o fator de multiplicação de um atributo.
Neste gráfico, um parâmetro escalar é multiplicado por uma cor sólida, e o resultado é conectado à entrada Cor Emissiva. O valor no parâmetro escalar controla a intensidade do efeito emissivo. Valores mais altos aumentam o brilho da emissão.
Parâmetros vetoriais
Um VectorParameter é um parâmetro que contém um valor vetorial de quatro canais ou quatro valores de ponto flutuante.
Eles geralmente são usados para fornecer cores configuráveis, mas também podem ser usados para representar dados posicionais ou direcionar qualquer efeito que exija vários valores.
Parâmetros de textura
O parâmetro de textura mais comumente usado é TextureSampleParameter2D, que permite alterar as texturas dentro de uma instância de material.
Existem vários tipos adicionais de parâmetros de textura disponíveis. Cada um é específico para o tipo de textura que ele aceita ou para a forma como está sendo usado. Por exemplo:
TextureSampleParameterCube aceita um TextureCube ou um cubemap.
TextureSampleParameterFlipbook aceita uma FlipbookTexture.
TextureSampleParameterMeshSubUV aceita uma Texture2D que é usada para efeitos sub-UV com um emissor de malha.
TextureSampleParameterMeshSubUV aceita uma Texture2D que é usada para efeitos de mesclagem sub-UV com um emissor de malha.
Confira a Referência de expressões de material para obter uma lista completa dos parâmetros de textura.
Parâmetros estáticos
Parâmetros estáticos são aplicados em tempo de compilação e, portanto, podem ser editados no Editor de Instâncias de Material, mas não a partir do script ou em tempo de execução.
Eles podem ser usados para mascarar ramificações de um material. Por exemplo, um parâmetro StaticSwitch usa duas entradas. Ele gera o primeiro valor se o valor do parâmetro for verdadeiro e o segundo se for falso. Isso produz um código mais ideal, pois a ramificação que foi mascarada por um parâmetro estático não é executada em tempo de execução.
Confira Parâmetro de interruptor estático e Parâmetro de máscara de componente estático para obter mais informações sobre os tipos de parâmetro estático específicos.
Um novo material é compilado para cada combinação de parâmetros estáticos no material base que são usados por instâncias.
Isso pode levar a um número excessivo de shaders que precisam ser compilados. Tente minimizar o número de parâmetros estáticos no material e o número de permutações desses parâmetros estáticos que são realmente usados.
Instâncias constantes e dinâmicas
Existem dois tipos de instâncias de material disponíveis no Unreal Engine:
Constante de instância de material: calculada somente antes do tempo de execução.
Dinâmica de instância de material: pode ser calculada (e editada) em tempo de execução.
Instância constante de material
Uma Constante de instância de material é um Material instanciado que é calculado apenas uma vez, antes do tempo de execução. Isso significa que não ele pode mudar durante o jogo. Embora permaneçam constantes durante todo o jogo, eles ainda têm a vantagem de desempenho de não exigir compilação.
Por exemplo, se o seu jogo tiver uma variedade de carros com diferentes trabalhos de pintura cujas cores não mudarão durante o jogo, a prática recomendada é criar um material mestre que represente os aspectos básicos de uma pintura de carro genérica. Em seguida, crie Constantes de instância de material para representar as variações de diferentes tipos de carro, como cores diferentes, níveis variados de rugosidade e assim por diante. Essa abordagem foi demonstrada com o exemplo da cadeira anteriormente nesta página.
As constantes de instância de Material são criadas no Navegador de conteúdo e editadas no Editor de instância de material.
Dinâmica da instância do material
Uma Instância de material dinâmica (MID) é um material instanciado que pode ser calculado durante o jogo (em tempo de execução). Isso significa que, enquanto você joga, pode usar um script (código compilado ou script visual de Blueprint) para alterar os parâmetros do seu material, alterando assim o seu material ao longo do jogo. As aplicações possíveis para isso são infinitas, desde a exibição de diferentes níveis de danos até a alteração das cores da tinta em uma visualização arquitetônica.
MIDs são criadas dentro do script, seja a partir de um material parametrizado ou de uma constante de instância de material. No Blueprint, seria possível usar um determinado material que tivesse propriedades parametrizadas e alimentá-lo por meio de um nó Criar instância de material dinâmica. O resultado desse nó seria então aplicado ao objeto em questão com um nó Definir material. Isso produz um novo material que pode ser alterado durante o jogo.
Criar e usar instâncias de material
Criar e usar instâncias de Material é um processo de duas etapas. Primeiro, é necessário criar um material pai que use expressões de parâmetro para as propriedades que você deseja substituir em uma instância de material. Em seguida, é possível criar uma instância de material e personalizar suas propriedades no Editor de Instâncias de Material.
Para aprender a criar um material parametrizado e usá-lo em uma instância de material, leia aqui: Criar e usar instâncias de material.