Por vários anos, tentei entender os mapas normais e os problemas que geralmente surgem ao trabalhar com eles.
A maioria das explicações que achei foram muito técnicas, incompletas ou muito complicadas para eu entender, então decidi tentar explicar as informações que coletava. Entendo que essas explicações podem estar incompletas ou não totalmente precisas, mas tentarei de qualquer maneira.
Os primeiros modelos 3D criados pelo homem eram algo assim:
Isso é ótimo, mas esse modelo tem uma limitação óbvia: parece muito poligonal.
A solução mais óbvia: adicione mais polígonos, tornando a superfície mais uniforme e lisa, até que os polígonos apareçam como uma única superfície lisa. Mas acontece que, para tornar superfícies suaves como esferas, você precisa de um grande número de polígonos (especialmente hoje).
Era necessária uma solução diferente e, portanto, os normais foram inventados. (Não aconteceu exatamente assim, mas é mais fácil explicar e entender.)
Vamos seguir a linha do centro do polígono perpendicular à sua superfície. Vamos dar a esta linha um nome muito incomum: normal. O objetivo do normal é controlar para onde a superfície aponta, para que, quando a luz refletir nessa superfície, ela possa usar o normal para calcular a reflexão resultante. Quando a luz atinge o polígono, comparamos o ângulo do raio de luz com o normal do polígono. O feixe é refletido no mesmo ângulo em relação à direção normal:
Em outras palavras, o reflexo da luz será simétrico em relação ao normal do polígono. É assim que a maioria das reflexões no mundo real funciona. Por padrão, os raios de luz são refletidos de todos os polígonos completamente perpendiculares à sua superfície (como deveriam na vida real), porque as normais do polígono são perpendiculares à superfície do polígono por padrão. Se houver lacunas nas normais, então as veremos como superfícies separadas, pois a luz será refletida em uma ou outra direção.
Se as duas faces estiverem conectadas, podemos solicitar ao computador que suavize a transição entre o normal de um polígono para outro, para que os normais sejam gradualmente alinhados de acordo com o normal mais próximo do polígono. Assim, quando a luz atingir exatamente o centro de um polígono, ela será refletida diretamente, de acordo com a direção do normal. Mas entre os polígonos, essa direção normal é suavizada, alterando o reflexo da luz.
Nós perceberemos a transição como uma superfície única, porque a luz será refletida entre um e outro polígono de maneira suave e não haverá lacunas entre elas. De fato, a luz reflete esses polígonos sem problemas, como se tivéssemos muitos polígonos.
É isso que controlamos definindo grupos de suavização (3ds Max, Blender) ou especificando arestas como rígidas ou suaves (Modo, Maya): informamos ao programa quais transições entre faces devem ser suaves e quais devem ser difíceis.
Aqui está uma comparação de uma esfera de 288 polígonos com transições rígidas e suaves:
Potencialmente, podemos especificar algo como um paralelepípedo para que todos os seus vértices tenham uma média normal. O editor 3D se esforçará para suavizar sua superfície para que pareça uma única superfície lisa. Para um editor 3D, isso é bastante lógico, mas parece muito estranho, porque temos um objeto que obviamente deve ter várias superfícies separadas (cada face da caixa); no entanto, o programa tenta mostrá-las como uma superfície lisa.
É por isso que os editores 3D geralmente têm um parâmetro para suavizar ângulos: se tivermos dois polígonos conectados em um ângulo que exceda o ângulo de suavização, sua transição será suave e a conexão de polígonos em um ângulo menor que o ângulo de suavização será rígida. Devido a isso, os ângulos íngremes entre as superfícies serão exibidos como superfícies diferentes, como acontece no mundo real.
Então, usamos as normais para controlar as transições entre as faces do modelo, mas você pode ir ainda mais longe.
Como estamos mudando a maneira como a luz é refletida em um objeto, também podemos fazer com que um objeto muito simples reflita a luz como complexa. Isso é chamado de mapa normal. Usamos uma textura para alterar a direção da luz refletida em um objeto 3D, fazendo com que pareça mais difícil do que realmente é.
Um exemplo do mundo real são os hologramas que foram dados de presente na compra de batatas fritas (pelo menos aqui, na Espanha). Eles são completamente planos, mas refletem a luz da maneira que um objeto 3D faria, tornando-o mais difícil do que realmente é. No mundo dos gráficos 3D, isso funciona ainda melhor, mas ainda tem suas limitações (já que a superfície permanece plana).
Embora usemos as normais poligonais para implementar algum tipo de magia negra, na verdade, não controlamos a suavização da superfície do modelo usando as normais poligonais. Usamos vértices normais para controlar a suavização das normais. Em essência, a idéia é a mesma, mas um pouco mais complicada.
Cada vértice pode ser associado a um ou mais normais. Se ele tem um normal, então podemos chamá-lo de normal médio do vértice e, se vários - então o normal dividido do vértice.
Vamos pegar dois polígonos conectados por uma aresta. Se a transição entre duas faces for suave (se a especificarmos como suave no Maya / Modo, ou ambas tiverem o mesmo grupo de suavização no Max / Blender), cada vértice terá um normal, que é a média normal dos polígonos (por isso é chamado de normal normal do vértice) ) Nota importante: até recentemente, cada editor 3D usava sua própria maneira de calcular as normais normais dos vértices, ou seja, os mapas normais calculados em um programa em outro podiam parecer completamente diferentes. Vou falar mais sobre isso na segunda parte do tutorial.
Se a transição for difícil (borda rígida ou grupos de suavização diferentes), cada vértice possui vários valores normais: um para cada vértice conectado alinhado de acordo com os valores normais. Nesse caso, é formada uma lacuna entre as normais, que se parecem com duas superfícies diferentes. Isso é chamado de vértice dividido normal.
Como você pode imaginar, o controle normal de vértices é muito importante se quisermos controlar mapas normais. Felizmente, não precisamos alterar os normais diretamente ou até mesmo vê-los, mas entender como isso funciona ajudará você a entender por que estamos fazendo esse trabalho e a entender melhor os problemas que podemos encontrar.
Ao elaborar um mapa normal, basicamente dizemos ao programa para alterar a direção que os normais do modelo lowpoly seguem, para que correspondam à direção no modelo highpoly; portanto, o modelo lowpoly refletirá a luz da mesma maneira que o highpoly. Toda essa informação é armazenada em uma textura chamada mapa normal. Vejamos um exemplo.
Digamos que tenhamos um modelo tão baixo de poli (lowpoly). Uma superfície plana de quatro vértices com configurações de UV que o programa de cozimento usará para criar um mapa normal.
E ela precisa obter informações sobre os normais desse modelo de alta polêmica, cujos normais são mais complicados.
Lembre-se de que apenas transferimos informações sobre normais, como UV, material, topologia, transformações etc. não relevante. Regra comprovada: se o modelo highpoly parece bom, suas normais também são boas e devem ser adequadas para assar.
O programa de cozimento usa um modelo lowpoly e emite raios seguindo as instruções dos normais lowpoly (é por isso que precisamos controlar os lowpoly normais). Esses raios têm um comprimento limitado para não obter informações normais de bordas distantes (geralmente essa distância é chamada de distância do forno ou distância da gaiola). Quando esses raios colidem com highpoly, o programa de cozimento calcula como refletir esses raios para que eles sigam a direção das normais highpoly e armazena essas informações no mapa normal.
Aqui está o resultado do cozimento para o nosso exemplo:
Temos uma textura que o mecanismo usa para alterar as normais de baixa densidade, de modo que a luz reflita esse modelo de baixa densidade, exatamente como faria na versão de alta densidade. Não se esqueça de que essa é apenas uma textura que não afeta a silhueta do modelo de baixa densidade (é impossível alterar a maneira como a luz é refletida no modelo se a luz não cair nesse modelo).
Embora esteja claro que é possível "contar" a aparência de um ponto alto pela aparência de um mapa normal, é óbvio que os mapas normais não são texturas comuns porque armazenam informações não sobre cores, mas sobre normais. Isso também significa que mapas normais não podem ser considerados texturas comuns; além disso, como veremos, eles têm parâmetros especiais de compactação e correção de gama.
Você pode perceber o mapa normal como um conjunto de três texturas em tons de cinza, armazenadas em uma imagem:
A primeira imagem informa ao mecanismo como esse modelo deve refletir o incidente de luz à direita; é armazenado no canal vermelho da textura normal do mapa.
A segunda imagem informa ao mecanismo como o modelo deve refletir o incidente de luz por baixo *; é armazenado no canal verde da textura normal do mapa.
* Em alguns programas, a luz não cai de baixo, mas de cima, ou seja, pode haver mapas normais do lado esquerdo e do lado direito. Como veremos mais adiante, isso pode causar alguns problemas.
A terceira imagem informa ao mecanismo como o modelo deve refletir o incidente de luz pela frente; é armazenado no canal azul da textura normal do mapa. Como a maioria dos objetos parece branco quando iluminada pela frente, os mapas normais geralmente aparecem azulados.
Quando combinamos as três imagens em uma, obtemos um mapa normal. Lembre-se de que essa explicação não está completamente correta, mas espero que ela permita que você entenda as informações armazenadas dentro do mapa normal e compreenda melhor o que faz.
Para resumir:
Normais são vetores usados para determinar como a luz é refletida de uma superfície. Eles podem ser usados para controlar a transição entre faces (calcular a média normal dos vértices conectados para criar uma transição suave ou separá-los para criar uma transição rígida), mas você também pode alterar a direção deles para que o modelo lowpoly reflita a luz da mesma maneira que um modelo mais complexo.
Essas informações são armazenadas em três canais de imagem separados, e um editor 3D as lê para entender em qual direção a superfície do modelo deve ficar.
No próximo artigo da série, falaremos sobre como transformar essas partes do modelo highpoly em lowpoly.