Texturização ou o que você precisa saber para se tornar um Artista de Superfície. Parte 5. Sistema de materiais

Nas partes anteriores dos tutoriais, vimos como as texturas são criadas. Mais precisamente, a maneira como tudo parece oculto (como Yoooriii colocou nos comentários da 4ª parte). Os termos foram estabelecidos - pixels e texels. Desmontou um pouco de modelos de varredura e grade, PBR e materiais. E, finalmente, traçamos uma linha sob a profissão de "artista em texturas". Parece que você já pode parar e começar a trabalhar.

Parte 1. Pixel aqui .
Parte 2. Máscaras e texturas aqui .
Parte 3. PBR e Materiais aqui .
Parte 4. Modelos, normais e varra aqui .
Parte 5. Sistema de materiais - você lê.

Bloco introdutório


Nesta parte, não teremos prática, pois a quinta parte se mostrou bastante grande. Todas as informações sobre como criar materiais e personalizá-los no Unreal Engine 4 podem ser encontradas nos tutoriais do Flakky e em muitos outros. Nossa tarefa agora é analisar a teoria com o máximo de detalhes possível (e, se faltar alguma informação, informe-me).

Em 2017, o artista técnico Harrison Moore se apresentou no Unreal Dev Day Montreal. Ele falou sobre qual abordagem de texturização ele e sua equipe usavam para garantir que o jogo Paragon tivesse materiais muito bonitos. Abaixo está um link para sua palestra.


O fato é que estamos criando um projeto de RV em que a qualidade das texturas é de grande importância. Por exemplo, criando texturas para objetos grandes (paredes, pisos, armários grandes, caixas etc.), descobrimos que o método padrão fornecia texturas muito pixelizadas e os chanfros criados usando arestas duras e um mapa normal (resolvemos isso 4 partes) quando os objetos estavam perto de seus olhos, eles pareciam tão pixelizados e miseráveis ​​que tivemos que aumentar o tamanho das texturas para corrigir isso. Por fim, para obter pelo menos uma aproximação ao resultado desejado, começamos a rebitar a textura de 8k. Acabou sendo muito caro criar texturas de 8k nos principais objetos grandes, mas visualmente foi satisfatório (máximo).

imagem

No começo, tudo correu bem. As texturas foram rebitadas, a qualidade é normal, mas, depois de montar uma cena a partir de objetos com essas texturas, percebemos que isso não funciona. O volume de texturas era muito grande - para que nosso projeto funcionasse com o usuário final, era necessário que a placa de vídeo tivesse pelo menos 3 gigabytes de RAM. E o tamanho de uma dessas texturas era de 67 milhões de texels. Mesmo apesar de essas texturas já estarem completamente calculadas e processadas, não era necessário um pequeno poder de computação da placa de vídeo para controlar todos os texels e exibi-los na tela. Mas entendemos que, para a implementação completa do PBR, não precisamos de 1 textura (e não 1 canal), mas de pelo menos 9 canais.
Como resultado, obtivemos cenas nas quais o volume de texturas era enorme, exigia os cálculos mais complexos e falhava no FPS dos quadros que precisávamos de 90 a 45. Ficou claro por que quase todos os jogos usam apenas texturas BaseColor, enquanto outros praticamente não se conectam. Por exemplo, o jogo Torn para VR:

imagem

A maioria (eu diria 90%) dos objetos é simplificada - o material consistia exclusivamente em BaseColor. Nenhum mapa normal, nenhum metal ou rugosidade. Infelizmente, as capturas de tela do jogo disponíveis na rede não permitem que você mostre o menos dessa abordagem e vice-versa; muitas vezes as capturas de tela mostram que existem todas as cartas e a imagem é muito bonita. Mas não vamos falar sobre este jogo.

Inicialmente, ignorei a palestra, cujo vídeo inseri acima. Mais precisamente, examinei e pensei que parecia ser uma boa abordagem, mas não alteramos o pipeline de criação de objetos e texturas em nossa equipe, pois isso exigiria um tempo suficientemente grande para dominar, apresentar e desenvolver habilidades. E, no entanto, diante do problema da qualidade do material, decidi reconsiderar a abordagem da texturização.
Começamos a entender o que Harrison Moore estava oferecendo.

Pré-requisitos para a formação do conceito de "artista de superfície"


E assim Os caras da Epic Games desenvolveram uma abordagem interessante para texturizar (mais precisamente, falamos sobre isso). Eles adotaram a abordagem para criar texturas no Substance Painter (ou qualquer outro programa de texturização) e transferiram o cozimento de texturas do programa para o mecanismo diretamente (para ser mais preciso, esse processo pode ser chamado de geração processual de materiais). Ou seja, agora os cálculos para texturas de cozimento já são executados no próprio mecanismo e as texturas não são criadas, mas compiladas com antecedência. O resultado da compilação (shader) é armazenado em um formato que o mecanismo entende e, quando um modelo com esse shader é exibido, o resultado é sobreposto ao modelo.

Como isso funciona?

No motor, carregue a textura de qualquer textura (material) em tamanhos de 1k. Ou seja, o conjunto padrão é Cor base, ORM, Mapa normal. Tais texturas são carregadas com 10 a 20 peças. Por exemplo, 4 variedades de metal, 5 variedades de couro, várias variedades de plástico, madeira e assim por diante. Tudo isso é combinado em funções de sombreador para que você possa conectá-las facilmente mais tarde. 1 fatura = 1 função.

imagem

imagem

Depois disso, eles criam máscaras para o objeto que precisamos. Aqui, o Substance Painter se torna necessário novamente - com a ajuda dele, máscaras são criadas no objeto. Ou seja, você precisa especificar em quais locais do objeto quais texturas devem ser exibidas e, em seguida, desenhar a textura desejada no lugar certo no objeto:

imagem

imagem

Acima na captura de tela, você pode ver como o robô voador é pintado em cores brilhantes. Resumidamente - isso é feito especificamente para ver quais máscaras estão localizadas onde e onde. A segunda captura de tela mostra uma das máscaras.

Essas máscaras são carregadas no mecanismo. Eles também criam um mapa normal para cada objeto separadamente, a fim de suavizar os chanfros, exibir alguns pequenos elementos técnicos com a ajuda dele e também carregá-lo no mecanismo.

Em seguida, um novo sombreador (material) é criado, no qual as máscaras criadas são adicionadas. As funções necessárias do shader são adicionadas às texturas necessárias (por exemplo, metal enferrujado, plástico e metal novo) e, em seguida, o código é escrito (quase nada precisa ser escrito, afinal, a Epic Games fez todo o possível para tornar mais conveniente o trabalho), nas quais indicamos como misturar máscaras corretamente, quais texturas exibir sob quais máscaras, como exibir textura de sujeira e assim por diante.

Depois que tudo é montado, o sombreador é compilado e o resultado é exibido.

Bem, parece que isso - afinal, o mesmo pode ser feito no Painter e obter um resultado pronto. No entanto, isso não é verdade. E a telha é a culpa.

Um pouco sobre azulejos


Lado a lado (literalmente - lado a lado, lado a lado) - É uma repetição da textura, como se o lado a lado, se for menor que a área de texturização (UV). Isso é necessário para preencher as lacunas que se formam no espaço UV, se a textura for menor em tamanho. A placa de vídeo começa a duplicá-la quantas vezes for necessário para fechar a lacuna. O mosaico funciona de uma maneira interessante - a placa de vídeo calcula cada textura texel (por exemplo, 1k de tamanho). E quando se trata da parte duplicada, nenhum cálculo já foi feito, uma vez que já existe. A placa de vídeo simplesmente copia e cola os dados. Copie e cole. E não custa praticamente nada para desempenho. Isso não exige tanto recurso que não afeta nada, mesmo que você faça um mosaico de 10.000 * 10.000 repetições (e repita isso com nosso exemplo de cerca de 10 bilhões de texels por um minuto sobre os números), seu projeto não ficará lento por um segundo.

Continuar


Ou seja, agora podemos receber a fatura. Mostre no local certo na instalação e tinja (duplique) exatamente o necessário para atingir a qualidade desejada. Devido à telha, o tamanho dos tecidos é muito reduzido, o que aumenta a qualidade da textura em si.
A desvantagem dessa abordagem é a matemática - agora, para exibir as texturas no objeto, o shader precisa calcular várias operações várias vezes para exibir o resultado final e, em vez das 3 texturas padrão, o mecanismo precisa levar em conta máscaras, misturar normais, cores e assim por diante.

De fato, a perda nos cálculos é nivelada:

  1. Você pode e reutilizará as funções faturadas. Vez após vez em outros objetos. Ou seja, os cálculos serão os mesmos no total, mas o número de mapas de textura em si será menor às vezes. Você não precisa mais criar novas texturas para cada objeto, apenas defina áreas para texturas e use as mesmas texturas.
  2. Você pode criar tamanhos de máscara menores - por exemplo, 128 por 128 pixels. O que reduz os cálculos em centenas de vezes.
  3. Você pode ladrilhar texturas como desejar, obtendo um resultado que não pode ser alcançado usando o método de textura padrão.
  4. Ao adicionar outros cálculos e máscaras, você pode jogar com canais individuais, por exemplo, tornar o canal de rugosidade menor do que os mapas de cores, interrompendo a repetição visual da imagem e criando uma sensação de exclusividade em toda a superfície.
  5. Você pode impor funções de textura de forma que elas se movam em relação às coordenadas do objeto no espaço do mundo - dessa forma, você pode colocar 2 objetos idênticos com os mesmos sombreadores, mas ambos parecerão únicos.

Deve-se entender que essa abordagem não é para todas as plataformas. Por exemplo, jogos para celular já são difíceis de montar dessa maneira devido à complexidade dos cálculos.

O exemplo mais simples das desvantagens da abordagem padrão para texturização e o novo Material Layer System (como os caras da Epic Games chamavam essa abordagem) é Final Fantasy 15. Para melhorar a qualidade da imagem, eles lançaram um pacote com texturas de 4k. E o que é textura 4K? São 16 milhões de erros de cálculo texel por canal. E se houver 9 deles para o padrão PBR?
E aqui o poder do Sistema de Camadas de Materiais começa a emergir o máximo possível. Para coletar roupas no personagem usando texturas, basta usar 3-4 texturas (talvez mais). No total, será menor que as texturas padrão de alta resolução, o desempenho é aproximadamente no mesmo nível e a qualidade pode ser controlada por lado a lado e ajustada muito mais.

Sistema de camada de material


Os caras da Epic Games foram além e apresentaram uma versão beta do "Material Layer System", que não gerou hype e acabou sendo bastante buggy.
Um exemplo de seu trabalho pode ser visto neste vídeo:


Com base no fato de que o sistema ainda não era adequado para o trabalho, nos familiarizamos com ele, ficamos felizes que um dia o terminaríamos, mas por enquanto nos recusamos a trabalhar com ele e passamos a criar shaders manualmente, especificando diretamente cada máscara no shader.
Como resultado, começamos a experimentar.

Como nos livramos dos mapas normais


No início, trabalhar com texturas não foi muito tranquilo - alcançamos o efeito desejado com as texturas, mas ainda estávamos muito inibidos pelo mapa normal, pois ele precisava ser gerado para cada objeto para criar uma sensação de belos chanfros. Apesar da qualidade das texturas criadas por nós, ao se aproximar do objeto da câmera, os chanfros deixaram muito a desejar, mesmo com texturas de 8k (lembro que estávamos desenvolvendo um projeto para VR). Mas a textura 8k é um volume muito grande de texels. Tão grande que 2 conjuntos completos de texturas espremeram FPS até 45 quadros (para VR, você precisa de 90).

Então nos familiarizamos com o método de criação de chanfros, sobre o qual falei brevemente na quarta parte. A criação de chanfros em modelos de objetos tornou possível eliminar quase completamente os mapas normais. Sim, aumentamos os modelos de polígonos, mas não mais de 20-40%, enquanto a qualidade dos chanfros disparou.

Essa abordagem nos permitiu livrar-se de outro problema - costuras nas bordas. Criando chanfros no modelo, não era mais necessário cortar o modelo ao longo de arestas duras. Em princípio, não havia arestas duras nos modelos, então as ilhas se tornaram grandes, começaram a incluir grandes espaços e agora que estamos aplicando textura nos modelos, praticamente não há costuras nos modelos.

Isso não significa que agora em todos os objetos não temos um mapa normal separado. Simplesmente, a maioria dos objetos padrão pode fazer chanfros em modelos sem um mapa normal adicional.

Por fim, reduzindo gradualmente as máscaras, aumentando e complicando os shaders, começamos a criar materiais complexos que nos permitem texturar superfícies muito bonitas:

imagem

Acima do piso, há duas texturas - tiras de ferro - 32x32 pixels e hexágonos - 32x32 pixels. O material possui uma fórmula muito complexa - um número muito grande de operações para cálculos - cerca de 295 instruções. Para material comum, esse sombreador exigiria mais poder de computação, mas usamos apenas 32x32 = 1024 texels por canal. 9 canais = 10k texels, que devem ser levados em consideração ao calcular este material + mascarar 128x128. Um número muito grande de operações é nivelado por um pequeno número de texels para processamento. Como resultado, obtivemos uma imagem bonita com um shader muito rápido e fácil.
Devido a máscaras, controle competente de ladrilhos e canais, é possível criar shaders muito complexos que geram belos materiais e, ao mesmo tempo, praticamente não consomem recursos.

Por exemplo, no momento, usamos cerca de 10 a 15 texturas para todo o projeto (além de vários objetos únicos e totalmente texturizados usando o método padrão). O mesmo metal está em quase todos os objetos. Ele muda nos shaders - adicionamos cores diferentes ao material, mudamos os mapas de rugosidade da textura, aplicamos arranhões na máscara e suas coordenadas controlam as coordenadas do objeto (se estamos falando de objetos estáticos), o que leva a objetos únicos com suas fichas, rachaduras, sujeira .
Ao aumentar a resolução da tela, basta ajustar o ladrilho para que o número de texels corresponda ao número de pixels na tela. Com o método padrão de texturização, você terá que escavar todas as texturas, pegar projetos antigos no Painter e salvá-los novamente. E você precisa ter certeza de que a textura não vai. E então tudo isso precisará ser reimportado para o mecanismo e garantir que tudo ficará bem lá, que os shaders calcularão rapidamente texturas maiores do que antes.

Pensar com texturas


Quando conversei com artistas 3D sobre o tema das texturas, fui informado repetidamente que a maioria dos objetos não pode ser montada usando texturas, que isso requer uma textura separada com padrões exclusivos e outros componentes. Por exemplo, este caramanchão:

imagem

A complexidade de representar esse objeto no plano texturizado é que ele tem momentos únicos:

imagem

O padrão de cinto na parte superior do tecido pode ser transformado em uma textura separada e simplesmente aplicado sobre a textura do tecido. Ou costure um cinto na textura do tecido e obteremos uma textura de tecido exclusiva com um cinto:

imagem

Ao usar essa textura, a costura das correias no tecido será repetida constantemente na mesma área, mas isso não será evidente.

Pontos úmidos são feitos por uma máscara e sujeira ou outra coisa é aplicada. E já parece único.

A franja também se distingue pela textura e seu tamanho será muito pequeno, pois se repete. Você pode exibi-lo no modelo através da máscara.

Um padrão único em um gancho de metal pode ser aplicado com um decalque ou com uma camada separada de um pequeno cartão normal, que pode ser suavizado sob a posição de varredura e desenvolvido através da máscara.

Dobras em um rolo de tecido podem ser realizadas usando geometria ou mascarando com sombreamento. Na atual geração de ferro, adicionar um pequeno número de vértices não causará carga, e você sempre pode ocultá-los com filetes à distância.

Objetos de madeira podem ser chanfrados e, assim, remover completamente o mapa normal dos cálculos. E assim por diante A coisa mais importante aqui é que tudo isso é rapidamente passível de ajustes sem programas de terceiros e perda de tempo.

E o mais importante, todas essas texturas podem ser usadas em qualquer outro sombreador, ajustando cores e pontos.

Exceções


A maioria, eu diria, 95% de todos os objetos no jogo são cobertos por esse método. Em geral, até a pintura artesanal cai sob a textura e pode ser implementada através dela. No entanto, nem todos os objetos nesse estágio tecnológico podem ser implementados. Por exemplo, caracteres complexos que possuem elementos especiais. E mesmo se você pensar cuidadosamente sobre eles, poderá cobri-los com texturas - é importante vê-los em tempo hábil, cortá-los e escurecê-los.

Me ofereceram para demonstrar o sofá (figura abaixo) como um elemento que não pode ser texturizado.

imagem

No entanto, se você olhar de perto, o sofá tem 3 texturas (couro na parte superior, estofamento, madeira para as pernas) e 2 dificuldades - são dobras e costuras. As dobradiças podem ser imitadas de duas maneiras:

  1. Vértices adicionais.
  2. Um pequeno mapa normal adicional que emitirá ondas dobradas (um método mais atraente).

O mesmo se aplica às costuras - elas podem ser destacadas com uma máscara e iluminar a textura das costuras ou, novamente, com um mapa normal adicional.

Todas as quebras, todas as transições podem ser simuladas com texturas e máscaras, criando o mesmo resultado, mas com um número menor de texturas (só precisamos usar as texturas do tecido padrão para o nosso projeto e apenas alterar diretamente sua cor no shader).

Aqui você pode fazer uma pergunta - o que fazer com o desbotamento dos travesseiros? Máscaras resolvem esses problemas com um estrondo =)

Além disso, podemos usar as mesmas texturas para cadeiras. , . , . — . , , . , , , , .


. , , , — . , , .

, — , - , . , , . , , .

, , , , . , , . , - .

Substance Designer — , .
Epic Games " Jobs in Unreal Engine — Surface Artist ", , . , , .

:

, Qbercat Studio, «Cat Movies» ( , , -. , ) . 3D- 1 . 1- 3-5 3D-. , , .

Snake discord- " Unreal Engine — RuCommunity ", .
Flakky , .

, - — . , , , .

=)

Source: https://habr.com/ru/post/pt461545/


All Articles