Bonjours,
voila j'essaie de faire un billboard d'une sphere en utilisant un caré (je sais c'est un classique ) mais je voudrais surtout comprendre comment ca marche;
alors ca peut paraitre bizare mais enfaite j'ai trouver un code sur le net qui quand je le teste marche bien, mon probleme de comprehension se situe au niveau de vertex shader, ce vertex shader permet au caré de toujours faire face à la caméra (l'illumination et la modification en sphere etant faites dans le fragment shader), mais voila le probleme c'est que je ne comprend pas comment ce vertex shader permet au caré de faire face à la camera.
d'aprés ce que j'ai tester le vertice prend en entrée la position du caré (ou de la sphere!), et aussi 4 vertexID (specifiant a tour de role les 4 coin du carée), et aprés transforme les coordonnée de la sphere dans l'espace camera (viewspace) et de la il determine le vertex qui va vraiment etre donnée pour le reste du pipeline, selon le coin representé !
mais meme si tous cela se passe dans l'espace Camera doit etre la clé du truc, j'arrive pas à me situer et comprendre comment le carée au final fait toujours face à la camera !
Merci.
voici le code du vertex :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 attribute float vertexID; // ID du vertex courant out vec2 mapping; // Mapping de chaque position du Carré dans la sphere uniform float sphereRadius; // Rayon de la sphere uniform vec3 spherePos; // Position de la sphere dans le repere Objet out vec4 cameraSpherePos; // Position de la sphere (centre) dans le repere Eye void main() { vec2 offset; switch(vertexID) { case 0: //Bas-Gauche mapping = vec2(-1.0, -1.0); offset = vec2(-sphereRadius, -sphereRadius); break; case 1: //Haut-Gauche mapping = vec2(-1.0, 1.0); offset = vec2(-sphereRadius, sphereRadius); break; case 2: //Bas-Droite mapping = vec2(1.0, -1.0); offset = vec2(sphereRadius, -sphereRadius); break; case 3: //Haut-Gauche mapping = vec2(1.0, 1.0); offset = vec2(sphereRadius, sphereRadius); break; } cameraSpherePos = (gl_ModelViewMatrix * vec4(spherePos,1.0)); vec4 cameraCornerPos = cameraSpherePos; cameraCornerPos.xy += offset; gl_Position = gl_ProjectionMatrix * cameraCornerPos; }
Partager