Eu tenho uma textura carregada em three.js e depois passada para os shaders. No shader de vértice, calculo o normal e salvo em uma variável o vetor uv.
<script id="vertexShader" type="x-shader/x-vertex">
varying vec3 N,P;
varying vec2 UV;
void main() {
gl_Position= projectionMatrix * modelViewMatrix * vec4(position,1.0);
P= position;
N= normalMatrix * vec3(normal);
UV= uv;
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
varying vec3 N,P;
varying vec2 UV;
uniform sampler2D texture;
void main() {
gl_FragColor= texture2D(texture,UV);
}
</script>
Como computo os vetores T e B?
textures
glsl
uv-mapping
three.js
Ramy Al Zuhouri
fonte
fonte
Respostas:
Primeiro de tudo, para todo vértice 3D, há infinitos vetores tangentes e bi-tangentes. A imagem abaixo explica por que existe um número infinito de espaços tangentes para cada vértice, a tangente e a bitangente podem ter qualquer direção no plano mostrado.
Portanto, para calcular corretamente o espaço tangente 1 mais útil , queremos que nosso espaço tangente seja alinhado de forma que o eixo x (a tangente) corresponda à direção u no mapa de relevo e o eixo y (bitangente) corresponda à direção v no mapa de relevo, já devemos ter o vértice normal, que já corresponde à direção Z no espaço tangente.
(1) mais útil porque, no final, queremos que vetores normais sejam amostrados a partir da textura
Isso é melhor explicado com fotos, queremos que nosso espaço tangente seja alinhado como
(u, v)
mostrado abaixo.Fonte da imagem, embora não estritamente relacionada à computação gráfica
Em computação gráfica, os desenvolvedores geralmente usam
(u,v)
também conhecidas como coordenadas de textura. Vamos assumir que T é a tangente e B é a bitangente, eP0
é o nosso vértice alvo, que faz parte do triângulo(P0,P1,P2)
.Primeiro lembre-se o que queríamos fazer é calcular a tangente e o bitanget que:
O ponto é que já assumimos que T e B estão no mesmo plano e correspondem a U e V agora. Se pudermos conhecer seus valores, podemos cruzar o produto e o terceiro vetor para construir uma matriz de transformação do mundo para o espaço tangente.
Dado que sabemos que qualquer vetor 2D pode ser escrito como uma combinação linear de dois vetores independentes 2 e já que temos os pontos do triângulo (arestas), mostrados na imagem acima. Nós podemos escrever:
(2) na verdade é assim que a matriz base é derivada
A equação acima pode ser escrita em uma matriz,
Resolvendo a equação da matriz, podemos determinar os valores T e B, podemos construir uma matriz de transformação.
O código fonte completo em C ++
Código fonte completo e derivação podem ser encontrados aqui .
fonte