Bonjour
J'ai toujours pensé que "W" était utilisé pour permettre une translatation quand on multiplie un vecteur avec une matrice. Une fois la multiplication fini, on pouvais diviser les composantes du vecteur par W, non ?
On divise par w en générale que pour la position des vertices, pour avoir une projection non orthogonal (ou dite en perspective) de tes objets sur ta surface de rendu, si tu veux mettre un angle de projection d'une camera par exemple. (je ne dis pas qu'on ne l'utilise pas pour d'autre calcul) Mais tu peu très bien programmer une projection orthogonal sur ta surface de rendu si nécessaire, auquel cas tu ne dois pas diviser par gl_Position.w.
projection non orthogonal (perspective):

projection orthogonal :

Donc la nécessité de diviser par gl_Position.w depend si tu es en GL_MODELVIEW ou en GL_PROJECTION, si tu est en GL_MODELVIEW, opengl fera automatiquement la division de gl_Position par sa composante w.
donc en GL_MODELVIEW, le shader qui convient est celui ci :
gl_Position = mProjection * mView * mModel * vec4(vertexPosition, 1.0);
sinon, c'est c'est l'autre 
Personnellement, pour un rendu en perspective (donc en projection non orthogonal), je me met en en GL_MODELVIEW, et je laisse OpenGL se débrouiller comme il sais bien le faire avec la division par w ainsi que ses corrections de perspective. Tu n'as pas besoin de le codé toi même dans ton vertex (ainsi que dans le geometry ou tessellation évaluation) shader. Mais si tu insiste pour le faire quand même, passe en GL_PROJECTION, et donc OpenGL affichera tout bêtement ton triangles au coordonné gl_Position.xy de ton viewport, et gl_Position.z dans le depth buffet.
D'un point de vu générale, lors d'une multiplication matricielle interprété comme un changement de repère, w = 1.0 pour effectivement avoir la translation en compte. Mais tu peut aussi avoir w = 0.0 pour réorienté les normals, car la translation n'est plus prise en compte.

NormalOut = normalize((mModel * vec4(NormalIn, 0.0)).xyz) ;
Il est donc pas nécessaire de chargé une deuxième matrice liée au repère de ton objet pour les normals.
Note que si NormalIn est déjà normé, et que mModel est une matrice orthonormé, alors NormalOut sera aussi normé, donc normalize n'est plus nécessaire, ainsi tu gagnes en performance.
Libre a toi d'avoir d'autre interprétations du produit matricielle bien sur (barycentres pour la tessellation etc ...) :cool:
J'espère avoir été suffisamment clairs.
Partager