web-dev-qa-db-fra.com

Dans les vertex shaders OpenGL, qu'est-ce que w et pourquoi est-ce que je le divise?

void main(void)
{
  vec4 clipCoord = glModelViewProjectionmatrix * gl_Vertex;
  gl_Position = clipCoord;

  gl_FrontColor = gl_Color;

  vec3 ndc = clipCoord.xyz / clipCoord.w;

Ainsi, le clipCoord ne fait que des transformations de pipeline fixes standard. Pourquoi dois-je diviser par w, et qu'est-ce que j'en retire?

42
anon

W est la quatrième coordonnée d'un sommet tridimensionnel; Ce sommet est appelé coordonnée de sommet homogène.

En quelques mots, la composante W est un facteur qui divise les autres composantes vectorielles. Lorsque W vaut 1,0, les coordonnées des sommets homogènes sont "normalisées". Pour comparer deux sommets, vous devez normaliser la valeur W à 1,0.

Pensez au sommet (1,1,1,1). Augmentez maintenant la valeur W (w> 1.0). La position normalisée est mise à l'échelle! et ça va à l'Origine. Pensez au sommet (1,1,1,1). Maintenant, diminuez la valeur W (W <1.0). La position normalisée va à un point infini.

Outre la mise à l'échelle des coordonnées des sommets, la coordonnée W est nécessaire car vous devez multiplier une matrice 4x4 (la vue du modèle et/ou les matrices de projection) par une matrice 4x1 (le sommet).

Bien sûr, le Livre rouge est le guide incontournable:

Annexe du livre rouge

44
Luca