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 ...
fonte
Respostas:
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 deGL_RGBA8
um de 4 bytes por pixel (GL_RGB8
ainda 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?
fonte
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".
fonte
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
fonte
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.
fonte