Mapas normais vs normais

17

Estou usando o importador de ativos Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) para analisar modelos 3D.

Até agora, eu simplesmente retirei os vetores normais que são definidos para cada vértice em minhas malhas. No entanto, também encontrei vários tutoriais em mapas normais ...

Pelo que entendi nos mapas normais, os vetores normais são armazenados em cada texel de um mapa normal e você os retira da textura normal no shader.

Por que existem duas maneiras de obter os normais, qual é considerado a melhor prática e por quê?

KaiserJohaan
fonte

Respostas:

31

Resposta curta

Mapas normais e Normais são duas coisas diferentes: Normais são uma propriedade geométrica de qualquer malha / superfície; seu uso não é exclusivo para cálculos de sombreamento e iluminação, mas na verdade tem muitos outros usos, por exemplo, na física. Mapas normais são texturas que codificam vetores normais alternativos usados ​​em gráficos de computador para simular solavancos.

Resposta longa

Normais na geometria, um normal é um vetor ou uma linha que é perpendicular a um determinado objeto (por exemplo, plano normal, vértice normal). As normais nos gráficos geralmente são usadas para cálculos de luz, como o cálculo da reflexão difusa em uma superfície, levando o produto escalar entre a direção da luz e as normais da superfície. As normais são normalmente calculadas com base nas propriedades geométricas da malha (Faces / Vértices), obtendo-se o produto cruzado de quaisquer duas arestas não paralelas que estão no mesmo plano.

No OpenGL, os normais são especificados por vértice (portanto chamados de atributos de vértice), embora possam ser calculados apenas para cada face, nesse caso, você precisa especificar o mesmo normal para cada vértice em uma face. As normais podem ser interpoladas pelo OpenGL em cada vértice de uma face (triângulo) para que você possa calcular a luz refletida por pixel e não por vértice, fornecendo um resultado mais preciso .

Mapeamento Normal : por outro lado, é uma técnica em computação gráfica que codifica Normais em um mapa de textura, de modo que cada normal é codificado por texel. É geralmente usado para falsificar a iluminação de solavancos e amassados ​​(por exemplo, mapeamento de solavancos, mapeamento de paralaxe).

Como os normais são calculados com base nas propriedades geométricas da malha / superfície, o Normal Maps fornecerá normais alternativos que podem simular os solavancos para adicionar detalhes à superfície sem adicionar mais polígonos.

Os mapas normais geralmente são gerados usando um modelo 3D muito mais detalhado, calculando os normais com base nesse modelo e codificando-o em um Mapa Normal.

Por que precisamos dos dois?

Bem, falando apenas sobre renderização, os normais e os mapas normais geralmente são usados ​​juntos para obter o efeito de iluminação final; um bom exemplo pode ser um shader de resposta, onde você precisa do mapa normal para obter o efeito de iluminação de resposta e ainda precisará do normal geométrico para calcular o que é chamado de espaço tangente . O espaço tangente é geralmente usado para fornecer reutilização para mapas normais.

Lembre-se de que um normal é considerado um atributo geométrico da superfície e tem muito mais usos do que apenas cálculos de luz. Mapas normais, por outro lado, são geralmente usados ​​para efeitos superficiais.

Estendendo a resposta para explicar por que os espaços tangentes são importantes:

Resposta curta: Espaços tangentes são usados ​​para fazer mapas normais, independentemente da geometria subjacente.

[EDIT] Adicionado imagem para representar o mapa normal no espaço tangente e o mapa normal no espaço mundial.

insira a descrição da imagem aqui

Resposta longa: A figura abaixo mostra o plano UV e o normal que define o espaço tangente. Ao gerar um mapa normal, já sabemos que o espaço usado sempre terá o apontador Normal na direção Z (é por isso que os mapas normais ficam azulados) , isso nos ajudará a ignorar a curvatura da superfície **,.

O espaço tangente nos dá a vantagem de que a codificação normal de nossos mapas não está vinculada a valores normais de malha específicos. Suponha que codifiquemos nosso mapa normal no mundo ou no espaço de objetos, e cada normal codificado terá uma direção com base em como as normais normais da malha original variam no espaço do mundo, sem mencionar que o mapa normal será afetado pelas transformações do modelo.

insira a descrição da imagem aqui

Nas duas figuras acima, é bastante claro que o espaço tangente faz mapas normais (à direita), independentemente da geometria subjacente, porque todas as normais são codificadas quase na mesma direção com pequenas variações para simular o efeito dos solavancos.

** curvatura da superfície é definida pela quantidade que um objeto geométrico diverge de ser plano ou reto no caso de uma linha, mas isso é definido de maneiras diferentes, dependendo do contexto.

Representação do espaço tangente

concept3d
fonte
1
Se você puder encontrar uma imagem que mostre como uma textura normal sozinha não pode ser usada consistentemente sem um campo normal e tangente definido por vértice, você fará desta a melhor resposta para este problema intrigante para a maioria dos programadores gráficos iniciantes!
usar o seguinte código
Boa resposta, mas os normais não são interpolados pelo OpenGL em cada face. Você deve fazer isso sozinho e fornecer o normal interpolado ao OpenGL (ou ao seu código de sombreador).
Anastasios G
1
@AnastasiosG Acho que ele está falando sobre o comportamento padrão de dados variados, pois eles são interpolados em um triângulo sempre que um fragmento é calculado para uma primitiva específica. Eu sei que havia um sinalizador que você poderia usar para dizer ao OpenGL para usar um normal específico dentre os 3 normais de vértice possíveis de um triângulo, mas esse não é o comportamento padrão que eu conheço.
usar o seguinte código
1
@AnastasiosG Eu pensei que esse detalhe não ajudaria em nada a resposta, pois não se trata de como usar o OpenGL. Mas se isso ajudar, na era do pipeline fixo, você precisava do glShadeModel (GL_SMOOTH) para pedir ao openGL para interpolar. Na era do pipeline programável, você define as variáveis ​​como variadas ou in / out no shader para que o OpenGL possa interpolar.
concept3d
Gostaria de acrescentar que os mapas de relevo são simplesmente normais (geométricos) que são aumentados / reduzidos com base em uma textura em preto e branco. :)
Entalpi