O que você está procurando?
Engine & platform

Experimentando com Shader Graph: Fazendo mais com menos

RINALDO TJAN / UNITY TECHNOLOGIESContributor
Feb 25, 2021|12 Min
Experimentando com Shader Graph: Fazendo mais com menos
Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.

Você pode melhorar a eficiência do tempo de execução do seu shader sem sacrificar a qualidade dos seus gráficos, compactando informações de material de renderização baseada em física (PBR) em um único mapa de textura e colocando-as em camadas em um shader compacto. Confira este experimento.

Este experimento funciona tanto noUniversal Render Pipeline(URP) quantono High Definition Render Pipeline(HDRP). Para aproveitar ao máximo este artigo, você deve ter alguma familiaridade com o Shader Graph. Se você é novo no Shader Graph, explore nossos recursos para umaintroduçãoemais detalhessobre esta ferramenta para criação visual de shaders.

Ao trabalhar com recursos de arte em um ambiente semelhante a um terreno, geralmente são preferidas várias camadas de material que pode ser aplicado em mosaico, pois produzem melhores resultados de mesclagem. No entanto, o custo do desempenho da GPU de múltiplas amostras de textura e o crescimento do uso de memória com cada camada adicionada ao shader podem ser proibitivos para alguns dispositivos e ineficientes em geral.

Com este experimento, pretendi:

  • Faça mais com menos
  • Minimize o consumo de memória e seja econômico com a amostragem de textura na representação de um material PBR
  • Instruções para minimizar o shader
  • Executar mesclagem de camadas com o mínimo de canais de cores de vértice/mapa de splat
  • Amplie a funcionalidade do mapa splat/cor de vértice para mais recursos

Embora o experimento tenha atingido seus objetivos, ele traz algumas ressalvas. Você terá que definir suas prioridades de acordo com as demandas do seu próprio projeto para determinar quais compensações são aceitáveis para você.

1. Material PBR com textura única

Antes de aplicar as camadas, a primeira coisa que você precisa fazer é descobrir a embalagem do material PBR. O material PBR normalmente vem com os parâmetros para Albedo (BaseColor), Máscara de suavidade, Oclusão de ambiente, Metalicidade e Normal definidos.

Normalmente, todos os cinco mapas são representados em três mapas de textura. Para minimizar o uso de textura, decidi sacrificar a Metalicidade e a Oclusão de Ambiente para este experimento.

Os mapas restantes – Albedo, Suavidade e Definição Normal – seriam tradicionalmente representados por pelo menos dois mapas de textura. Reduzi-lo a um único mapa requer algum pré-processamento de cada canal individual.

Material PBR com textura compacta

O resultado final do material PBR compactado em uma única textura. Vermelho = dHdu (altura das derivadas em relação à direção U) para definição normal#. Verde = dHdv (Altura das Derivadas em Relação à Direção V) para Definição Normal#. Azul = Tonalidade de cinza linear representando Albedo (cor reconstruída no shader). Alfa = Mapa de suavidade linear (mapa de suavidade padrão). Observação: A textura é importada para o Unity com sRGB desmarcado e compactada com o formato BC7. Ao portar para outras plataformas, mude para o formato de textura de 4 canais equivalente suportado pela plataforma.

Processando os mapas

Albedo

Albedo é normalmente definido como uma textura RGB; no entanto, muitos materiais semelhantes a terrenos (rocha, areia, lama, grama, etc.) consistem em uma paleta de cores limitada. Você pode explorar essa propriedade armazenando o Albedo como um gradiente em tons de cinza e, em seguida, remapeando-o por cores no shader.

Não há um método definido para converter o albedo RGB em um gradiente de tons de cinza. Para este experimento, o Albedo em tons de cinza foi criado por meio de mascaramento seletivo dos canais originais do mapa Albedo e oclusão de ambiente; para corresponder à cor proeminente na reconstrução da cor do shader, basta avaliar os ajustes manuais.

Coloração em destaque e escura com ajuste de contraste de rampa para reconstrução de Albedo.

Suavidade

A suavidade é considerada muito importante para a definição do material PBR. Para definir a suavidade com mais precisão, ela tem seu próprio canal.

Um multiplicador simples foi adicionado à suavidade no shader para alguma variação no material.

Multiplicador de suavidade

Definição normal

O mapa Normal é importante para mostrar as características detalhadas de uma superfície. Um material PBR típico usa um mapa normal de espaço tangente. Neste experimento, escolhi um mapa de derivadas pré-convertido usando a estrutura de gradiente de superfície pelos motivos abaixo. (Vejaa estrutura de gradiente de superfície de Morten Mikkelsen para mais informações).

Para pré-converter mapas normais do espaço tangente em derivadas, use esta ação do Photoshop.

Usar um mapa de Derivativos pré-convertido tem várias vantagens:

  • Pode ser convertido diretamente em gradiente de superfície, usando menos instruções do que um mapa normal de espaço tangente padrão, o que requer conversão de derivadas no shader
  • Pode ser armazenado em dois canais (dHdu e dHdv), resultando em menor espaço de memória e cache de textura em tempo de execução
  • Não requer reconstrução do canal azul no shader, o que é típico ao processar mapas normais do espaço tangente, já que a estrutura de gradiente de superfície cuida da reconstrução normal (menos instruções do shader)
  • Funciona corretamente quando ajustado no Photoshop – ou seja, mesclando, mascarando ou reduzindo a intensidade – e não requer renormalização. Por exemplo, para reduzir a intensidade, basta mesclar o mapa com RGB(128,128,0).

Em conjunto com a estrutura de gradiente de superfície, as vantagens incluem ainda:

  • Informações normais de relevo podem ser mescladas e compostas no shader da mesma forma que a mesclagem/composição de albedo, com o resultado correto.
  • Aumentar, reduzir e reverter as contribuições de colisão é trivial e preciso.

Mas derivadas pré-convertidas do mapa normal do espaço tangente também têm algumas desvantagens:

  • Usando a conversão do Photoshop, a definição normal é fixada em um ângulo maior que 45 graus, para equilibrar a precisão em uma textura de 8 bits.
  • Os artistas estão acostumados a trabalhar com mapas normais de espaço tangente e exigem que os mapas sejam pré-convertidos via Photoshop como parte de seu fluxo de trabalho.

Observação: O grampo em um ângulo maior que 45 graus não se aplica à conversão de derivados baseados em shader.

Dependendo do seu caso de uso, a limitação pode ter um efeito menor ou maior. Neste experimento, uma direção normal menor que 45 graus não tem um impacto negativo perceptível no resultado final. De fato, neste caso, ele oferece um benefício ao reduzir a reflexão indesejada da direção normal extrema.

Uma comparação entre uma textura de mapa de derivadas pré-convertida e uma textura de mapa normal de espaço tangente.
Diferenças no teste de estresse entre derivadas pré-convertidas e mapa normal do espaço tangente. Observe que a saliência esférica exibe algum artefato devido ao aperto de 45 graus no mapa de derivadas pré-convertido.
Gráfico
Gráfico
Gráfico

O processo completo de desempacotamento

Gráfico

O Sub Graph completo para descompactar a textura PBR compacta para gerar Albedo colorido, suavidade e gradiente de superfície.

Observação: A conversão do gradiente de superfície para Normal é feita fora do Subgráfico para que o material possa ser facilmente misturado com base na saída do UnpackedSubGraph.

Materiais
Materiais
2. Camadas de material

Para este experimento, escolhi um método de camadas baseado em camadas em um único remapeamento de canal. O Sub Graph faz cinco interpolações lineares (mais a base, formando seis camadas).

Há muitas maneiras de misturar pesos de camadas. Este método tem a simplicidade de uma única entrada vetorial, o que se adequa ao objetivo do experimento. Isso permitiu muitas camadas sem queimar vários canais em mapas splat ou canais de vértices.

A desvantagem desse método é que você não pode controlar o peso da contribuição de uma camada individual. A mesclagem sempre será uma transição da camada anterior. Dependendo do caso de uso, isso pode ser um fator limitante em comparação a uma combinação tradicional por canal.

Gráfico

O Sub Graph para remapear um único canal para representar as seis camadas.

O subgráfico mostrado acima é predefinido para seis camadas de mesclagem baseada em camadas. Para criar mais camadas, divida 1 pelo número desejado de camadas mescladas, subtraia 1 e remapeie cada camada com base nesse intervalo de valores.

Por exemplo, para um material de mistura de nove camadas, cada intervalo de remapeamento de camada é 1/(9-1) = 0,125.

Esteja ciente de que, ao dividir o canal único em porções menores, você terá menos alcance de sombreamento.

Camadas
Gráfico
Materiais
3. Ampliando a funcionalidade do material

A mesclagem de camadas requer apenas um único canal (o canal do vértice vermelho). Os três canais de vértice restantes oferecem funcionalidades extras. O Shader Graph final produz resultados usando os canais de vértice restantes.

Neste experimento, a pintura de vértices foi feita dentro do Unity Editor usando o Polybrush (disponível no Gerenciador de Pacotes). Paleta de cores Vertex Paint sugerida para este shader.

Vermelho: Usado para ponderar a contribuição da camada. Demonstração de pintura de canal de vértice vermelho

Verde: Define a propriedade de gradiente de superfície para inverter, reduzir ou adicionar contribuição de relevo normal (remapeada para -1 e 1).

  • 0 inverte o bump normal (-1)
  • O valor 0,5 zera o bump normal (0)
  • 1 define o aumento normal para o valor original (+1).

Demonstração de pintura de canal de vértice verde

Azul: Controla a suavidade e a escala de relevo do gradiente da superfície para criar uma aparência de água molhada

  • 0 = sem alteração
  • 255 = suavidade máxima e mapa normal plano (aparência molhada)

Demonstração de pintura de canal de vértice azul

Alpha: Controla o peso da camada Albedo, definindo a cor base como branca, com a contribuição baseada no eixo y da normal da superfície. Não altera a suavidade e aproveita a suavidade da camada superficial original e a propriedade de relevo.

  • 0 = sem neve
  • 255 = neve sólida

Pintura de canal de vértice alfa combinada com canais anteriores para mostrar como todas as camadas interagem com a neve

Os resultados combinados dos diferentes canais de pintura de vértices:

Você pode ajustar o método de mesclagem do shader e as configurações para as diversas funcionalidades do canal de vértice/mapa splat de acordo com os requisitos do seu projeto.

4. Comparando desempenho

O objetivo deste experimento foi estender a funcionalidade do Shader Graph e, ao mesmo tempo, minimizar os recursos. A textura foi pré-processada e descompactada, mas há alguma compensação na eficiência do tempo de execução?

O perfil de desempenho mostra a eficiência que esses esforços produziram.

Um shader de mesclagem padrão de seis camadas foi criado para comparação com o shader de mesclagem compacto de seis camadas. Ambos os shaders foram criados usando um método de mesclagem idêntico com as mesmas funcionalidades. A principal diferença é que o shader padrão usa três texturas diferentes para representar uma única camada.

Para criação de perfil, uma única malha foi renderizada na tela com material de mesclagem usando o Universal Render Pipeline na plataforma de destino.

Perfil de desempenho e memória móvel

Compressão de textura para dispositivos móveis (Android):

PBR padrão com mapa de Albedo, Máscara e Normal em 1024x1024 para dispositivos móveis:

  • Mapa de Albedo 6x ASTC 10x10 = 6x 222,4 KB
  • Mapa de máscara 6x ASTC 8x8 = 6x 341,4 KB
  • Mapa normal 6x ASTC 8x8 = 6x 341,4 KB

Uso total de memória de textura 5.431 MB

PBR compacto de 1024x1024 para dispositivos móveis:

  • 6x PackedPBR Texture ASTC 8x8 = 6x 341.4 KB

Uso total de memória de textura 2.048 MB

Com o material compacto de seis camadas, há aproximadamente 62% menos consumo de memória de textura no celular (Android), uma economia de mais da metade. Celular Android/Vulcan com Adreno 630 (Snapdragon 845); Resultados do perfil Snapdragon:

  • Aproximadamente 70% menos leitura de memória de textura em tempo de execução.
  • O Standard levou 9971020 relógios para renderizar.
  • O Compact levou 6951439 relógios para renderizar.

O material compacto é renderizado na tela aproximadamente 30% mais rápido. Resultado da criação de perfil do Snapdragon Profiler.

Perfil de memória e desempenho do PC

PBR padrão com mapa de Albedo, Máscara e Normal em 1024x1024:

  • 6x Albedo map DTX1 = 6x 0.7 MB
  • Mapa de máscara 6x DXT5/BC7 = 6x 1,3 MB
  • 6x Mapa normal DXT5/BC7 = 6x 1,3 MB Uso total de memória de textura 19,8 MB

PBR compacto em 1024x1024:

  • 6x Textura PBR compactada BC7 = 6x 1,3 MB

Uso total de memória de textura 7,8 MB

O material compacto de seis camadas consome 60% menos memória de textura no PC (economia de mais da metade).

Laptop PC com renderização Radeon 460 Pro em 2880x1800; resultados do perfil RenderDoc:

  • Desenhar opacos para mistura padrão de 6 camadas: 5,186 ms.
  • Desenhe opacos para uma mistura compacta de 6 camadas: 3,632 ms. O material compacto é renderizado na tela aproximadamente 30%* mais rápido. *O valor do perfil RenderDoc flutua; 30% é uma média de amostras.

Desktop para PC com renderização nVidia GTX 1080 em 2560x1440; resultados do perfil nSight:

  • Render Opacos para material padrão de 6 camadas: 0,87 ms
  • Render Opacos para material compacto de 6 camadas: 0,48 ms

O material compacto é renderizado na tela aproximadamente 45% mais rápido. Resultados de criação de perfil do nSight.

Perfil de desempenho do console

No PlayStation 4, o uso de material compacto gera uma economia de memória de 60%, idêntica à do PC, já que o PS4 usa a mesma compressão.

Renderização base do PS4 em 1920x1080; resultados do perfil Razer:

  • Render Opacos para material padrão de 6 camadas: 2,11 ms
  • Render Opacos para material compacto de 6 camadas: 1,59 ms

O material compacto é renderizado na tela aproximadamente 24,5% mais rápido.

Resultado da criação de perfil do PS4 Razor.

Em resumo, usar um shader PBR compacto de seis camadas oferece ganho de desempenho e economia significativa de memória. A variação do desempenho da GPU é interessante, mas esperada, pois descompactar o material consome mais ALUs do que amostrar mais texturas.

Baixe o projeto de amostra

Este projeto de amostra com Shader Graphs e Sub Graphs pode ser baixado aqui:

[BAIXE AQUI], Unity 2020.2.5f1 com HDRP 10.3.1

[BAIXE AQUI], Unity 2020.2.5f1 com URP 10.3.1

[BAIXE AQUI], ação do Photoshop para pré-converter o mapa normal do espaço tangente em derivadas.

Remover

Captura de tela da versão do projeto no Universal Render Pipeline.

Os principais componentes deste experimento são:

  • Shader Graph para material personalizado
  • Derivativos pré-convertidos
  • Estrutura de gradiente de superfície
  • Reconstrução da cor do albedo
  • Mesclagem de camadas de canal único
  • Técnica de mesclagem UpVector, controle de suavidade e relevo via mesclagem de canal de vértice

Este experimento mostra como você pode usar o Shader Graph para produzir gráficos bonitos e também eficientes. Esperamos que este exemplo possa inspirar artistas e desenvolvedores a ultrapassar os limites estéticos com seus projetos Unity.

Sobre o autor

Rinaldo Tjan (Diretor Técnico de Arte, P&D, Equipe Spotlight) é um artista 3D em tempo real com extrema paixão por sistemas de iluminação e renderização em tempo real.

Tendo começado sua carreira na época do PlayStation 2, ele tem mais de uma década de conhecimento completo sobre fluxo de trabalho artístico, desde a texturização até a criação da cena renderizada final. Antes de ingressar na Unity Technologies, ele ajudou a entregar jogos AAA como BioShock 2, O Bureau: XCOM Desclassificado, e Máfia III.

Atualmente, ele trabalha com clientes da Unity para ajudá-los a ampliar seus projetos e realizar seu verdadeiro potencial usando a Unity, ao mesmo tempo em que ajuda a impulsionar o desenvolvimento interno e os padrões dos recursos de renderização da Unity.