7/17

3.4. Programme complet

  • Téléchargez l’archive, compilez et exécutez le programme complet permettant l’affichage du triangle suivant.

triangle

Coordonnées de l’espace écran

  • Modifiez les valeurs des composantes \((x,y)\) du triangle. Essayez d’en déduire le système de coordonnées utilisé par OpenGL. Plus précisément, où les points suivants sont placés sur l’écran (gardez une fenêtre carrée)

    • \((-1,-1)\)

    • \((-1,1)\)

    • \((1,1)\)

    • \((1,-1)\)

    • \((0,0)\)

Note: Aucune projection n’est appliquée dans le vertex shader, ainsi les coordonnées 3D du triangle correspondent directement aux clip coordinates utilisés par OpenGL, et dont les coordonnées (x,y) correspondent aux coordonnées de l’espace image.

  • Modifiez la composante \(z\) des coordonnées du triangle. Différenciez deux cas

    • \(z\in[-1,1]\)

    • \(|z|>1\)

Explications

L’espace des coordonnées visibles par OpenGL est contenu dans le cube normalisé entre [-1,1]. La notion de clip coordinates indique que seuls les fragments situés à l’intérieur de ce cube unité sont visualisés, alors que ceux situés en dehors ne sont pas traités.

Dans le cas où l’on insère une notion de perspective, les coordonnées normalisées du clip space correspondent à une pyramide tronquée (à base rectangulaire) dans l’espace des coordonnées du monde. Cette pyramide tronquée appelée frustum indique quels sommets (ou plus précisément fragments) seront visibles. On parle alors de frustum culling.

Modification du shader

  • Modifiez le fragment shader pour afficher un triangle uniformément jaune.

  • Modifiez le vertes shader pour appliquer une translation et un homothétie ("scaling") sur le triangle.

En notant que les coordonnées des sommets sont des coordonnées homogènes à 4 dimensions, expliquez la différence visuelle obtenue entre les deux codes suivants dans le vertex shaders

gl_Position = position;
gl_Position *= 2.0;

et

gl_Position = position;
gl_Position.xyz *= 2.0;

Second triangle

Considérez que la variable position dans le code C++ est désormais initialisée de la manière suivante. On considèrera que les 3 premières coordonnées correspondent à un triangle, et les 3 suivantes, à un autre triangle.

const std::vector<GLfloat> position = {
    -0.5f, -0.5f, 0.0f,
     0.5f, -0.5f, 0.0f,
     0.0f,  0.5f, 0.0f,



     0.9f,  0.9f, 0.0f,
     0.6f,  0.9f, 0.0f,
     0.6f,  0.6f, 0.0f
};
  • Adaptez le code de manière à pouvoir afficher ces deux triangles.

triangle exercise