O que exatamente é o mapeamento UV e UVW?

26

Tentando entender alguns conceitos básicos de 3D, no momento estou tentando descobrir como as texturas realmente funcionam. Eu sei que o mapeamento UV e UVW são técnicas que mapeiam Texturas 2D para Objetos 3D - a Wikipedia me disse isso. Pesquisei no google por explicações, mas só encontrei tutoriais que supunham que eu já sabia o que era.

Pelo meu entendimento, cada modelo 3D é feito de pontos, e vários pontos criam um rosto? Cada ponto ou face tem uma coordenada secundária que mapeia para a posição ax / y na Textura 2D? Ou como o desembrulhar manipula o modelo?

Além disso, o que o W no UVW realmente faz, o que ele oferece sobre o UV? Pelo que entendi, W mapeia para a coordenada Z, mas em que situação eu teria texturas diferentes para o mesmo X / Y e Z diferente, a parte Z não seria invisível? Ou estou entendendo completamente errado isso?

Michael Stum
fonte
11
Faça duas perguntas separadamente
Noob Game Developer
11
Eu odeio pessoas como @NoobGameDeveloper, todo mundo está respondendo à pergunta e tudo o que está fazendo é tentar descobrir coisas que estão erradas com a pergunta. Vamos deixá-los fazer perguntas, não estou dizendo que ninguém deve seguir as regras, mas essas perguntas como essas são completamente aceitáveis ​​para serem postadas aqui.
Daniyal Azram

Respostas:

23

Sua compreensão está próxima. Cada modelo 3D é feito de vértices. Cada vértice geralmente define a localização de um ponto no espaço, um normal (usado em cálculos de iluminação) e uma ou mais coordenadas de textura. Eles geralmente são designados como u para a parte horizontal da textura e v para a vertical.

Quando um objeto é texturizado, essas coordenadas são usadas para procurar qual texel ou pixel plotar a partir da textura. Acho mais fácil pensar nelas como porcentagens ou proporções entre a borda esquerda da textura ( u = 0) e a borda direita da textura ( u = 1.0) e a partir da parte superior da textura ( v = 0) e da parte inferior dele ( v= 1,0). Eles são interpolados entre os vértices e pesquisados ​​para cada pixel na tela que é renderizado. Eles podem ser maiores ou menores que esses intervalos e o estado de renderização definido quando o objeto é renderizado especifica o que acontece. As opções para isso são CLAMP e REPEAT. O aperto limita a coordenada a 0 ou 1, fazendo com que a textura fique manchada onde está fora do intervalo. Repetir faz com que a textura se repita quando estiver fora do intervalo; é efetivamente o mesmo que pegar apenas a parte decimal da coordenada e usá-la em seu lugar.

Antes de as coordenadas de textura serem aplicadas a um objeto, elas são multiplicadas por uma matriz de textura para aplicar alguma transformação a elas (como escala, translação ou rotação). Às vezes, esse efeito é animado em jogos para fazer parecer que algo está se movendo através de um objeto sem ter que mover o próprio objeto ... a textura está simplesmente rolando por ele. Quando a matriz textura é multiplicado pelas coordenadas de textura, produz 2 valores que são usados para procurar o texel a trama (vamos chamá-los é e t ). Eles são gerados automaticamente de u e v mesmo quando a matriz de textura não está definida; é o equivalente a multiplicar u e v por uma matriz de identidade.

É aqui que a coordenada w entra, embora não seja usada com tanta frequência. É um parâmetro extra para multiplicar a matriz de textura e geralmente é usado quando você deseja levar em consideração a perspectiva (como no Mapeamento de Sombra ). Funciona da mesma maneira que quando você transforma um local no espaço do objeto em espaço da tela por meio de uma matriz de projeção de visão de mundo. Por multiplicação da UVW com uma projecção transformar, que acabam com 2 coordenadas, os s e t que são então mapeados para uma textura 2D.

Joel Baker
fonte
Vale ressaltar que o OpenGL trata a v0 como a parte inferior e a v1.0 como a parte superior. Isso me custou muito tempo no passado, quando eu não conseguia encontrar o bug quando minhas texturas pareciam estranhas.
precisa saber é
8

Considere um triângulo.

Cada canto tem uma coordenada UV. Você interpola entre eles para obter um conjunto de coordenadas UV para cada pixel. (Também há perspectiva em jogo aqui, mas vamos ignorar isso por enquanto).

Então, você obtém um texel da textura das coordenadas U e V. Ou seja, um pixel da coordenada da textura x, y - a mesma coisa, terminologia ligeiramente diferente, já que estamos falando de texturas.

Se sua textura for verdadeiramente tridimensional, você também precisará de uma terceira coordenada, W.

Uma maneira de visualizar isso é pensar em um bloco de madeira. Se você cortá-lo de alguma forma, verá que cada plano dentro do bloco contém uma textura 2d das sortes.

Texturas 3D são tão raras que você pode esquecê-las por enquanto.

Jari Komppa
fonte
Raro? Para que são usados? Você pode mostrar algum exemplo no contexto de títulos AAA.
Quazi Irfan
Não, porque geralmente eles nunca são usados. Sempre há uma maneira mais barata de fazer a mesma coisa. Pense nos itens picados no wii sports plus; você pode quebrar os itens da maneira que desejar e ver os "internos". Eles poderiam ter desperdiçado grandes quantidades de memória, transformando-as em texturas 3D (supondo que o hardware seja compatível com isso), mas é muito mais barato simular isso com algumas texturas 2D.
Jari Komppa
Então, eles não são exclusivos? ou esse não é um recurso muito necessário para qualquer coisa bem conhecida que o mecanismo de jogo faz?
Quazi Irfan
Eu não entendo o que você quer dizer. As texturas 3D podem ser úteis em outros usos além de simplesmente texturas; se alguns dados que um shader precisar mapeia convenientemente em uma matriz 3d, esse seria um uso. Mas como uma textura "normal", eles geralmente são apenas um desperdício de memória.
Jari Komppa
Uma aplicação de uma textura 3D é o Mapeamento de Distância, embora, como diz Jari, eles sejam muito incomuns em um jogo devido à sua complexidade. [link] http.developer.nvidia.com/GPUGems2/gpugems2_chapter08.html
Jackalope
7

Pense em origami.

Um mapa UV é como uma capa 2D achatada (sem embalagem) da sua malha 3D (concha).

Se você recortar o mapa e dobrá-lo ao longo das linhas de malha, o resultado seria o seu modelo 3d.

Os valores do ponto flutuante (U, V) variam de (0,0) a (1,1). O canto superior esquerdo do mapa de UV é (0,0) O canto inferior direito é (1,1)

Cada vértice em uma malha de polígonos (tris / quads) possui um valor (U, V) que informa ao representante qual parte do mapa usar.

No pipeline da GPU, os shaders de vértice calculam as projeções 2D de cada pixel nesses polígonos 3D e, em seguida, os shaders de fragmentos os colorem usando o mapa UV.

Isso não pode ser totalmente apreciado sem uma imagem como esta, que torna tudo óbvio:

Malha UV

Como os outros comentadores mencionados, o componente W é usado pelo renderizador para efeitos mais sofisticados, como o mapeamento de sombras, mas o mapa UV é a base para a compreensão.

Observe que um shader de vértice deve chamar um shader de fragmento pelo menos uma vez para cada pixel que precisa ser colorido. É por isso que as GPUs são processadores paralelos com dezenas de núcleos - o pipeline do shader é muito exigente.

Observe também que as GPUs integradas à CPU são projetadas para dispositivos móveis e estão limitadas a menos de um décimo do número de núcleos que o de GPUs externas de geração semelhante. Isso devido a restrições de energia e refrigeração móveis. A lei de Moore parece ter diminuído a velocidade, mas o desempenho ainda está melhorando (com o estranho derretimento aqui e ali ..)

O mapeamento de UV bilhões de pixels a mais de 240 quadros por segundo pode causar uma verdadeira bagunça!

Dominic Cerisano
fonte
0

Um mapa uv mapeia um ponto (x, y, z) na malha para um ponto (u, v) na imagem da textura. Como uma imagem mapeia (u, v) para uma cor, os dois mapas podem ser encadeados, produzindo um mapa do espaço da malha para o espaço da cor.

         uv map       color map
 (x,y,z)   ->   (u,v)    ->     color
 mesh           Texture
 space          space
golopot
fonte