Como o mapeamento normal realmente funciona?

10

Estou tentando entender o conceito de mapeamento normal, mas estou confuso com algumas coisas. Em resumo, não tenho certeza se um mapa normal depende ou não do ponto de vista (ou seja, se você obterá um mapa normal diferente do mesmo objeto ao girá-lo). Em segundo lugar, não entendo por que a cor azulada é a cor predominante nos mapas normais.

Como eu penso sobre normais, e sua relação com cores RGB, é a seguinte. A esfera unitária representa qualquer unidade normal possível - em outras palavras, os componentes X, Y e Z de um vetor normal unitário variam de -1 a 1. Os componentes de uma cor RGB variam de 0 a 255. Portanto, faz sentido para mapear -1 (componente normal) para 0 (componente de cor), 0 a 127 ou 128 e 1 a 255. Qualquer valor intermediário é interpolado linearmente.

A aplicação desse mapeamento às normais de um objeto 3D arbitrário resulta em uma imagem muito colorida, não predominantemente azul. Por exemplo, ao pegar um cubo, todas as seis faces teriam uma cor diferente, mas uniforme. Por exemplo, a face com o normal (1,0,0) seria (255,128,128), a face com o normal (0,0, -1) seria (128,128,0) e assim por diante.

No entanto, por alguma razão, os mapas normais de um cubo que encontrei são completamente azulados, ou seja (128,128,255). Mas, claramente, as normais não estão todas na direção z positiva, isto é (0,0,1). Como é que isso funciona?

[Editar]

Ok, a abordagem descrita acima parece ser chamada de mapa normal do espaço de objeto ou mapa normal do espaço de mundo . O outro é chamado de mapa normal do espaço tangente . Entendo como um mapa normal de espaço tangente pode ser usado para modificar as normais de uma geometria, mas ainda não tenho certeza de como é realmente calculado (veja meu comentário na resposta de Nicol Bolas).

[Editar 2]

Eu provavelmente deveria mencionar que estou trabalhando com superfícies paramétricas por partes. Essas superfícies consistem em um conjunto de amostras de superfícies , onde cada amostra é associada ao seu próprio espaço paramétrico (u, v) = [0,1] x [0,1]. Em qualquer ponto da superfície, o normal pode ser calculado exatamente. Aparentemente, os vetores T ( tangente ) e B ( bi-tangente ) - necessários para abranger o espaço tangente - não são simplesmente as derivadas parciais do remendo de superfície na direção de u e v ...

Ailurus
fonte
Você já tentou implementar phong ou pelo menos sombreamento difuso? Você conhece fórmulas básicas como ponto (a, b) = cos (ângulo (a, b)) para os vetores unitários a, b? Poucas horas de implementação poupariam anos de luta.
Ivan Kuckir
@Ailurus: veja meu comentário / resposta sobre como abordar o mesmo problema para objetos de terreno / campos de altura. Fica um pouco mais complicado para outros objetos, mas os conceitos não devem diferir.
teodron
O caso particular de terreno mappping normal: gamedev.stackexchange.com/questions/43894/...
teodron

Respostas:

14

Um mapeamento de textura é o mapeamento entre pontos na superfície 3D e seus pontos correspondentes em uma imagem de textura. Se você tiver um mapeamento de textura 1: 1, todos os pontos na superfície 3D serão mapeados para um ponto específico e exclusivo na imagem da textura (embora o inverso não precise ser verdadeiro. Alguns locais na textura não necessariamente serão mapeados para locais na superfície).

Com esse mapeamento, você pode percorrer a superfície 3D e armazenar cada normal distinto no local correspondente na textura.

OK, tudo bem, vamos fazer isso. Iremos percorrer uma superfície 3D e gerar normais de espaço para objetos nos locais mapeados e depois colá-los na textura. Então, quando queremos renderizar, simplesmente buscamos o espaço do objeto normal da textura e terminamos. Direita?

Bem, sim, isso funcionaria. Mas isso também significa que os normais da textura só podem ser usados ​​com esse objeto em particular. E também significa que as normais da textura só podem ser usadas com esse objeto e com esse mapeamento de textura específico . Portanto, se você quiser girar o mapeamento de textura de alguma forma ou alterá-lo com alguma transformação UV, não terá sorte.

Então, geralmente, o que as pessoas usam são mapas normais, onde os normais estão no "espaço tangente". Espaço tangente é o espaço relativo ao ponto mapeado na superfície 3D, onde o normal não modificado está na direção + Z e os eixos X e Y apontam ao longo dos eixos U e V em relação à superfície.

O espaço tangente regulariza essencialmente os normais. No espaço tangente, o normal (0, 0, 1) sempre significa "não modificado"; é o normal que você obtém ao interpolar o vértice normal. Isso leva a várias coisas úteis que você pode fazer , uma das mais importantes é armazená-las em menos dados.

Como o Z sempre será positivo, é possível computá-lo no shader a partir dos componentes X e Y. Como você só precisa de 2 valores, pode usar (na nomenclatura do formato de imagem OpenGL ) GL_RG8, um formato de 2 bytes por pixel em vez de GL_RGBA8um de 4 bytes por pixel ( GL_RGB8ainda será de 4 bytes por pixel , uma vez que as GPUs preencherão cada pixel em 4 bytes). Ainda melhor, você pode compactar esses dois valores , levando a um formato de 1 byte por pixel. Então você reduziu o tamanho da sua textura para 75% do mapa normal do espaço do objeto.

Antes de poder falar sobre qualquer tipo de mapa normal, você precisa primeiro saber o que ele armazena. É um mapa normal do espaço de objeto, um mapa normal do espaço tangente ou algo mais?

Nicol Bolas
fonte
Tudo bem, então o primeiro tipo de mapa que você descreve é ​​um mapa normal do espaço de objeto , certo? Este é o mais colorido, porque armazena os componentes X, Y e Z reais dos normais. O segundo tipo, o mapa normal do espaço tangente , parece armazenar algo parecido com as perturbações para os normais e não para os próprios normais. Vou ler sobre o conceito de espaço tangente e voltar mais tarde.
Ailurus
Ok, então o espaço tangente de um ponto na superfície é simplesmente o espaço de todos os vetores tangentes desse ponto. No entanto, nesse caso, não vejo como o normal, visto do espaço tangente, pode ser outra coisa senão (0,0,1)? Em outras palavras, eu sempre esperaria que o mapa normal fosse uniformemente azul (128,128,255). No entanto, o exemplo mostrado na página da wikipedia ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) contém outras cores. Entendo como esse mapa pode ser usado para alterar as normais, mas não como é realmente calculado.
Ailurus
@Ailurus: " Ok, então o espaço tangente de um ponto na superfície é simplesmente o espaço de todos os vetores tangentes desse ponto. " Não, não é. É o espaço definido pelo normal (não modificado) e a direção da textura é coordenada naquele ponto na superfície. Regularizou o normal armazenado na textura como sendo relativo ao mapeamento da textura e o normal atual antes das modificações.
Nicol Bolas
Provavelmente, a parte mais difícil sobre um mapa normal é o próprio mapeamento (incluindo como calcular os vetores tangentes). A computação dos vetores tangentes não está intrinsecamente ligada ao mapeamento / empacotamento UV da textura difusa E à geometria do objeto? Em outras palavras: você tem dois mapas normais diferentes para um objeto, mas apenas um campo tangente (e normal) calculado. Você pode descobrir que não pode usar o campo tangente de forma consistente com duas texturas normais diferentes (embora geometricamente possa encontrar mapeamentos uv adequados, o que não é uma tarefa trivial).
usar o seguinte comando
@ NicolBolas Ah, fiquei confuso porque algumas fontes afirmam que os vetores T, B e N formam uma base ortonormal, enquanto outros mencionam que isso não é necessariamente verdade.
Ailurus
3

Os mapas normais são mapeados usando o chamado espaço tangente, que é essencialmente um espaço local baseado no espaço de textura do modelo. Isso deve responder às duas perguntas.

Não depende do ponto de vista, porque esse espaço não tem nada a ver com a câmera. No mapa normal, Z é a direção para cima. Se você observar as normais de um modelo, a maioria dos vetores normais estará apontando diretamente para fora da malha. A superfície da malha é o espaço de textura que eu estava falando, portanto, nesse sistema de coordenadas local, acima é a direção "externa".

malho
fonte
Obrigado por esclarecer isso! No entanto, não estou usando uma malha poligonal como superfície, mas uma superfície paramétrica suave e por partes . Portanto, todas as normais seriam salvas como apontadas na direção (0,0,1), certo?
Ailurus
1

Role para baixo nesta página

Observe o desenho P / B à direita em conjuntos de dados - isso é (ou pelo menos costumava ser) conhecido como desenho de ouriço, uma renderização de uma superfície com cada uma de suas normais desenhadas

Portanto, para entender um mapa normal tradicional, pense em um ouriço chateado com todos os espinhos de fora - cada um desses espinhos é normal à superfície do ouriço debaixo dele -

Com relação à sua questão de esfera, se você estivesse vivendo puramente no espaço paramétrico, como nos traçadores de raios, o conjunto infinito de normais para a esfera criaria simplesmente uma esfera maior - no espaço em mosaico, ou seja, o mundo que o computador nos força se queremos tempo real, então você tem uma aproximação espetada de uma esfera.

Agora, este exemplo se concentrou em um mapa normal de OBJECT - está definindo normais em relação ao objeto, e é invariável sob qualquer rotação, tradução ou redimensionamento - do objeto ou da câmera ou qualquer outra coisa - como mencionado anteriormente, isso é apenas um tipo de mapa normal, mas é o mais comum

Mark Mullin
fonte
0

Eu acho que você pode ter alguns conceitos errados sobre o que são mapas normais. Basicamente, é uma maneira de simular a aparência de algo esburacado quando, na verdade, a geometria é completamente plana.

As cores de um mapa normal são interpretadas por um shader técnico e processadas com base na intensidade e direção da luz, bem como na visualização da câmera. Isso significa que você pode ter um piso de tijolos, por exemplo, que é completamente plano, com uma textura plana, mas como ele tem um mapa normal com a mesma forma de tijolos, quando você olha em volta, a luz parece estar refletindo na lateral dos tijolos fazendo com que pareça mais 3D do que é.

É claro que isso é apenas uma ilusão, mas é muito mais barato do que ter geometria complexa. E não, as cores do mapa normal não mudam. Eles realmente representam apenas valores para comparar no shader. Tenho certeza de que alguém aqui poderá informar você com muito mais detalhes.

SirYakalot
fonte
Eu sei, mas mesmo assim obrigado pela sua resposta :)
Ailurus