A página Tipos de dados de materiais apresentou as quatro maneiras de representar dados no Editor de materiais. Para criar materiais de maneira eficaz, é necessário não só conhecer esses tipos de dados, como também saber manipular dados e controlar de que maneira as informações trafegam pelo gráfico de materiais.
Dois tópicos são discutidos neste documento.
- Manipulando tipos de dados: Como combinar floats em um vetor multicanal e, inversamente, como isolar informações de um tipo de dados maior.
- Aritmética do gráfico de materiais: Regras e processos para realizar operações aritméticas em um material com diferentes tipos de dados.
Manipulando tipos de dados
Só porque uma informação se origina como um tipo de dados não significa que ela precise permanecer assim. Por exemplo, você pode combinar ou Anexar dois parâmetros escalares (floats) em um vetor de dois canais (float2) para transmiti-los a uma entrada que requer dados de dois canais. Por outro lado, você pode usar uma ComponentMask para recuperar um subconjunto específico de canais de um vetor maior.
As expressões de material documentadas nesta seção fornecem maneiras de combinar e separar dados para controlar de que maneira as informações fluem através do seu gráfico de materiais.
AppendVector
Uma expressão de material AppendVector combina os dados em Entrada A com os dados em Entrada B e gera um vetor multicanal (float2, float3 ou float4). Neste exemplo, duas constantes são anexadas para gerar um float2: (1, 2).
Exemplo de caso de uso
O nó Append geralmente é útil quando você deseja a capacidade de modificar dois valores independentemente um do outro, mas precisa transmiti-los para uma entrada que requer dados multicanal. O gráfico abaixo dá aos artistas uma maneira de controlar o ladrilhamento ou a escala UV de uma textura em uma instância de material, mas apenas uniformemente.
A desvantagem neste exemplo é que o gráfico de materiais contém apenas um parâmetro, mas as coordenadas UV têm dois canais. Com essa solução, você não pode controlar a largura e a altura da textura de forma independente.
Isso pode ser resolvido isso usando uma AppendVector. Crie um parâmetro escalar separado para cada eixo e, em seguida, transmita-os ao nó Append. O nó Append combina os dois parâmetros em um float2, que é então multiplicado pelas coordenadas de textura.
Como Ladrilhamento X e Ladrilhamento Y são parametrizados separadamente, agora você pode controlar a largura e a altura da textura independentemente.
Ordem de anexação
A expressão AppendVector combina dados na ordem em que eles são anexados ao nó. Os dados na Entrada B são sempre anexados ao final dos dados na Entrada A. Considere as duas imagens abaixo.

- No primeiro slide, o resultado anexado é (0,05, 0,2, 0,8), ou azul claro, como mostra a visualização do nó.
- No segundo slide, o resultado anexado é (0.8, 0.05, 0.2), ou rosa, como mostra a visualização do nó.
AppendMany
AppendMany é uma Função de material que funciona da mesma forma que a expressão AppendVector, mas pode combinar até quatro valores float/escalares separados em um vetor multicanal.
Um benefício adicional da função AppendMany é que ela fornece três pins de saída diferentes. Isso dá acesso a alguns ou todos os canais anexados, dependendo do que você precisa para uma determinada situação.
O nó AppendMany aceita apenas valores float/escalares em suas entradas. Se você transmitir float2, float3 ou float4 ao nó AppendMany, todos, exceto o primeiro valor, serão descartados.
Máscara de componente
A expressão de material Máscara de componente serve ao propósito oposto aos nós Append documentados acima. Em vez de combinar dados, uma ComponentMask fornece uma maneira de separar os dados em suas partes componentes, ou canais.
Uma máscara de componente funciona como um portão. Para quaisquer dados conectados à sua entrada, você pode escolher exatamente quais canais podem passar pela saída. A imagem abaixo mostra um Constant4Vector contendo valores de (0, 1, 0.7, 0.5). Quando você seleciona o nó Mask no gráfico, quatro caixas de seleção são exibidas no painel Detalhes.
Essas caixas de seleção determinam quais canais o nó gerará. Atualmente, nenhuma está marcada, portanto, o nó Mask não gerará informações. Se você tentar conectá-lo a uma entrada downstream, o nó exibirá um erro.
Essas caixas de seleção fornecem uma maneira de filtrar as informações e usar apenas os canais necessários.
Suponha que você queira usar o valor no canal A para controlar a opacidade de um material. Você habilitaria o canal A marcando a caixa e, em seguida, conectaria o pin de saída da máscara à Entrada de opacidade.
A ComponentMask descarta os canais R, G e B porque eles estão desmarcados e gera apenas o valor no canal A, neste caso, 0.5.
Aritmética do gráfico de materiais
A segunda maneira principal de manipular dados em um gráfico de materiais é por meio de operações matemáticas. Todas as operações aritméticas comuns estão disponíveis no Editor de materiais.
As quatro expressões de materiais aritméticas. Leia mais na página Expressões de materiais matemáticas.
O propósito básico dos nós aritméticos deve ser relativamente evidente. Por exemplo, se você inserir valores constantes de 0.3 e 0.2 em um nó Add, este calculará 0.3 + 0.2 e gerará um valor de 0.5 . A aritmética entre dois valores constantes é simples e direta.
No entanto, conforme demonstrado na página de tipos de dados, as informações nem sempre percorrem o gráfico de materiais como valores float individuais. Por causa disso, é importante entender as regras e os processos para realizar operações aritméticas entre vários tipos de dados em um material. Existem duas grandes áreas de preocupação.
- Nem todos os tipos de dados são compatíveis entre si para operações aritméticas.
- As operações aritméticas funcionam de maneira diferente dependendo dos tipos de dados envolvidos.
Tipos de dados compatíveis e incompatíveis
O exemplo acima mostrou uma simples operação de adição entre dois valores float, ou 0.3 + 0.2 = 0,5. Essa operação funciona porque ambos os valores são do mesmo tipo de dados. O que acontece se um tipo de dados diferente for transmitido para uma das entradas? Esses três pontos resumem a compatibilidade entre os tipos de dados:
-
A aritmética entre tipos de dados equivalentes é sempre válida. Por exemplo, float2 + float2 retorna um novo float2.
-
A aritmética entre um float e qualquer float maior é válida. Por exemplo, float + float3 retorna um novo float3.
-
A aritmética entre dois tipos de dados não equivalentes é inválida. Por exemplo, float2 + float3 é inválido e retorna um erro.
Em outras palavras, a aritmética entre dois tipos de dados diferentes é possível, mas apenas se um deles for float. No gráfico abaixo, a operação 0.3 + (1,2) é válida. O float é adicionado a ambos os valores em float2, e o resultado é um novo float2 com valores de 1.3, 2.3).
No entanto, a aritmética entre dados float2, float3 ou float4 não equivalentes retorna um erro.
A tabela abaixo resume a compatibilidade de tipos de dados para a aritmética do gráfico de materiais.
| Tipo de dados | Tipos de dados compatíveis para aritmética |
|---|---|
| Float | Qualquer |
| Float2 | Float, Float2 |
| Float3 | Float, Float3 |
| Float4 | Float, Float4 |
Regras aritméticas entre tipos de dados
Também é necessário entender como os cálculos aritméticos são realizados entre diferentes tipos de dados. Os dois cenários abaixo demonstram como a aritmética funciona quando um ou ambos os tipos de dados são maiores que um float.
Aritmética entre tipos de dados equivalentes
Quando a aritmética ocorre entre tipos de dados equivalentes (float2 + float2, por exemplo), cada valor na Entrada A é operado pelo valor correspondente na Entrada B. O exemplo abaixo mostra a adição entre duas expressões Constant2Vector.
Escritas em formato longo, há duas operações de adição separadas. Os primeiros valores em cada nó são somados: (1 + 2). Em seguida, os segundos valores em cada nó são adicionados (3 + 3). O resultado é um novo float2: (2, 6).
O gráfico abaixo mostra um exemplo aritmético para cada um dos quatro tipos de dados.
| Entrada A, Entrada B | Dados de entrada | Notação matemática | Dados resultantes |
|---|---|---|---|
| Float, Float | (4) / (2) | 4 / 2 = 2 | 8 |
| Float2, Float2 | (1, 3) + (2, 3) | (1 + 2), (3 + 3) | (3, 6) |
| Float3, Float3 | (3, 2, 0.5) * (2, 1, 2) | (3 x 2), (2 x 1), (0.5 x 2) | (6, 2, 1) |
| Float4, Float4 | (2, 2, 2, 3) - (1, 1, 2, 2,) | (2 - 1), (2 - 1), (2 - 2), (3 - 2) | (1, 1, 0, 1) |
Aritmética entre um float e um vetor
Quando a aritmética ocorre entre um float e qualquer tipo de dados maior, o float é usado repetidamente para cada cálculo separado. Na imagem abaixo, um Constant e um Constant3Vector são multiplicados.
Conforme mostrado na ilustração, o valor em Constant é multiplicado por cada valor em Constant3Vector. Existem três expressões de multiplicação separadas: (2 3), (2 1) e (2 *2). O produto é um float3: (6, 2, 4).
O fato de o float estar na Entrada A ou na Entrada B não tem relação com a multiplicação e a adição, mas é claro que importa para a divisão e a subtração.
Na imagem acima, o valor em Constant (2) é subtraído de cada valor em Constant3Vector (6, 4, 3). Escrito em notação matemática: (6 - 2), (4 - 2), (3 - 2). O float3 resultante é (4, 2, 1).
Se você invertesse a ordem de entrada, os resultados seriam diferentes.
Como o float é agora o número superior no nó de subtração, cada operação aritmética é invertida: (2 - 6), (2 - 4), (2 - 3). O float3 resultante é (-4, -2, -1).
Conclusão
Os conceitos e técnicas nesta página são um componente chave na maior parte da lógica do gráfico de materiais que você usará para criar materiais. As páginas de referência vinculadas abaixo podem ajudar você a entender melhor as operações matemáticas e de manipulação de dados no Editor de materiais.