Bon, je me lance.
J'aurais une question concernant un programme de vertex effectuant le calcul du bumpmapping diffus.
La technique classique que j'utilisais jusqu'alors (en c++ donc) reposait sur les coordonnees S et T qui permettent de définir un repère local à chaque vertex. Le vecteur L projeté sur ce repère était normalisé par un cube map puis dot3-multiplié sur une normal map. Bon, que du classique donc.
Ca marchait sans problème sur l'implémentation classique ... beaucoup moins bien avec mon programme de vertex.
voilà en pseudo code la sequence c++ utilisée en combinaison avec le programme de vertex pour afficher un objet A (en mouvement constant) (1ere passe: calcul diffus):
- Calculer la position de la lumiere dans le repere de l'objet A
- Etablir cette position relative comme nouvelle position pour opengl
- Indiquer le tableau des normales
- Indiquer le tableau des coordonnees de texture pour le cube map
- Indiquer le tableau des coordonnees de texture pour la normal map
- Indiquer les tableaux des coordonnees S et T comme parametres generiques 11 et 12 du vertex program
- Tout afficher
Et maintenant le code commenté de mon programme de vertex pour le calcul diffus:
"!!ARBvp1.0
ATTRIB iPos = vertex.position;
ATTRIB iColor = vertex.color;
ATTRIB iNormal = vertex.normal;
ATTRIB iTexCoord0 = vertex.texcoord[0]; #pour le cube map
ATTRIB iTexCoord1 = vertex.texcoord[1]; #pour la normal map
ATTRIB coordS = vertex.attrib[11]; #element du tableau des S
ATTRIB coordT = vertex.attrib[12]; #element du tableau des T
PARAM lightPos = state.light[0].position; #position selon l'objet A
PARAM mvp[4] = { state.matrix.mvp };
TEMP vertexToLight; #vecteur L
OUTPUT oPos = result.position;
OUTPUT oColor = result.color;
OUTPUT oTexCoord0 = result.texcoord[0]; #c'est l'element a calculer
OUTPUT oTexCoord1 = result.texcoord[1]; #lui ne change pas
# transformation geometrique du vertex\n
DP4 oPos.x, mvp[0], iPos;
DP4 oPos.y, mvp[1], iPos;
DP4 oPos.z, mvp[2], iPos;
DP4 oPos.w, mvp[3], iPos;
# calcul du vecteur L puis normalisation\n
SUB vertexToLight, lightPos, iPos;
DP3 vertexToLight.w, vertexToLight, vertexToLight;
RSQ vertexToLight.w, vertexToLight.w;
MUL vertexToLight.xyz, vertexToLight.w, vertexToLight;
# calcul des coordonnees de textures du cubeMap\n
# projection de L selon S, T et la normale
DP3 oTexCoord0.x, coordS, vertexToLight;
DP3 oTexCoord0.y, coordT, vertexToLight;
DP3 oTexCoord0.z, iNormal, vertexToLight;
# le reste est transmis tel quel
MOV oColor, iColor;
MOV oTexCoord1, iTexCoord1;
END"
Alors voilà, ça marche ... mais pas comme il faudrait, l'objet s'affiche, on voit bien son bumpmap, mais celui réagit à la position de l'observateur et c'est là où je ne comprends plus ! qu'est ce qui, dans mon programme, dépend de la position de l'observateur ?
Selon moi juste le calcul géométrique du vertex, en aucun cas le calcul de L ou sa projection. Pourtant il suffit que je tourne la tête, pour que la surface se modifie, preuve qu'un changement opère dans les paramètres du programme.
Y-aurait-il une subtilité qui m'aurait échappé dans l'accés aux paramètres associés aux vertex ? Y-aurait-il une transformation implicite de certains d'entre eux ? Basiquement, ce calcul équivaut à celui que je faisais sur le CPU lorsque je n'utilisais pas de programmes de vertex. Il n'était pas nécessaire de transformer les normales car tout se passait dans le repere de l'objet, seule la source lumineuse était transformée.
Note: dans mes tests actuels, je n'ai pas encore implémenté le calcul spéculaire, donc se n'est pas lui qui aurait pu venir polluer mon rendu.
Note2: Je n'encombrerai pas le forum à chaque programme que j'écrirai, j'essaie seulement de comprendre les bases. Si j'arrive à écrire un programme qui marche, les autres devraient être beaucoup plus rapides à réaliser.
Je prends toutes les idées sinon !
Mille merci pour votre attention.
john_john