J'ai une texture chargée dans three.js, puis passée aux shaders. Dans le vertex shader, je calcule la normale et j'enregistre dans une variable le vecteur 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>
Comment calculer les vecteurs T et B?
textures
glsl
uv-mapping
three.js
Ramy Al Zuhouri
la source
la source
Réponses:
Tout d'abord, pour chaque sommet 3D, il existe des vecteurs tangents et bi-tangents infinis. L'image ci-dessous explique pourquoi il y a un nombre infini d'espaces tangents pour chaque sommet, la tangente et la bitangente peuvent avoir n'importe quelle direction dans le plan indiqué.
Donc, afin de calculer correctement l' espace tangent 1 le plus utile , nous voulons que notre espace tangent soit aligné de sorte que l'axe x (la tangente) corresponde à la direction u dans la carte de relief et que l'axe y (bitangent) corresponde à la direction v dans la bump map, nous devrions déjà avoir une normale du sommet qui correspond déjà à la direction Z dans l'espace tangent.
(1) plus utile parce qu'au final, nous voulons que des vecteurs normaux soient échantillonnés à partir de la texture
Cela doit être expliqué avec des images, nous voulons que notre espace tangent soit aligné comme
(u, v)
indiqué ci-dessous.Source de l'image mais pas strictement liée à l'infographie
En infographie, les développeurs utilisent généralement
(u,v)
également les coordonnées de texture. Nous supposerons que T est la tangente et B est la bitangente, etP0
est notre sommet cible, qui fait partie du triangle(P0,P1,P2)
.Rappelez-vous d'abord ce que nous voulions faire, c'est de calculer la tangente et le bitanget qui:
Le point est que nous avons déjà supposé que T et B se trouvent dans le même plan et correspondent à U et V maintenant si nous pouvons connaître leurs valeurs, nous pouvons croiser le produit et le troisième vecteur pour construire une matrice de transformation du monde à l'espace tangent.
Étant donné que nous savons que tout vecteur 2D peut être écrit comme une combinaison linéaire de deux vecteurs indépendants 2 et que nous avons déjà les points triangulaires (bords), illustrés dans l'image ci-dessus. Nous pouvons écrire:
(2) En fait, c'est ainsi que la matrice de base est dérivée
L'équation ci-dessus peut être écrite sous forme matricielle,
En résolvant l'équation des matrices, nous pouvons déterminer les valeurs T et B, nous pouvons construire une matrice de transformation.
Le code source complet en C ++
Le code source complet et la dérivation peuvent être trouvés ici .
la source