Pipeline 3D

Un article de Wikipédia, l'encyclopédie libre.

On appelle pipeline 3D la succession des opérations nécessaires au rendu d'un lot de données (maillages et textures principalement) sur un tampon chromatique, la plupart du temps celui-ci est ensuite affiché à l'écran. Les différentes étapes du pipeline 3D sont détaillées dans le schéma ci-contre.

Pipeline avec indication du lieu d'intervention des pixel et des vertex shaders (en rouge).
Pipeline avec indication du lieu d'intervention des pixel et des vertex shaders (en rouge).

Il est possible de résumer les opérations du pipeline 3D :

  • "Model to World" (M2W)
  • "World to Vue" (W2V)
  • "Vue to Projection" (V2P)
  • "Projection to Display" (P2D)

Sommaire

[modifier] Model to World transform

La matrice M2W correspond à une succession d’opérations réalisées sur un objet. Ces opérations sont :

  • la rotation
  • la translation
  • la mise à l'échelle

En terme physique on dirait qu’appliquer une matrice M2W à un objet revient à passer du référentiel propre à l’objet (le modèle) au référentiel commun à tous les objets d’une scène graphique (le monde).

[modifier] Les matrices de rotation

  • matrice de rotation dans le plan:

Image:Info_3D_repere_oij.PNG Soit 
A = \left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
\end{array}} \right);B = \left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
\end{array}} \right)
et 
\overline {OA}  = \overline {OB}
\left\{ {\begin{array}{*{20}c}
   {x_A  = \cos \alpha .\overline {OA} }  \\
   {y_A  = \sin \alpha .\overline {OA} }  \\
\end{array}} \right.

\left\{ {\begin{array}{*{20}c}
   {x_B  = \cos (\alpha  + \beta ).\overline {OB} }  \\
   {y_B  = \sin (\alpha  + \beta ).\overline {OB} }  \\
\end{array}} \right.
\Leftrightarrow

\left\{ {\begin{array}{*{20}c}
   {x_B  = (\cos \alpha .\cos \beta  - \sin \alpha .\sin \beta ).\overline {OB} }  \\
   {y_B  = (\cos \alpha .\sin \beta  + \sin \alpha .\cos \beta ).\overline {OB} }  \\
\end{array}} \right.
\Leftrightarrow

\left\{ {\begin{array}{*{20}c}
   {x_B  = \cos \alpha .\overline {OA} .\cos \beta  - \sin \alpha .\overline {OA} .\sin \beta }  \\
   {y_B  = \cos \alpha .\overline {OA} .\sin \beta  + \sin \alpha .\overline {OA} .\cos \beta }  \\
\end{array}} \right.
\Leftrightarrow

\left\{ {\begin{array}{*{20}c}
   {x_B  = x_A .\cos \beta  - y_A .\sin \beta }  \\
   {y_B  = x_A .\sin \beta  + y_A .\cos \beta }  \\
\end{array}} \right.

\Rightarrow 
\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
\end{array}} \right) = \left( {\begin{array}{*{20}c}
   {\cos \beta } & { - \sin \beta }  \\
   {\sin \beta } & {\cos \beta }  \\
\end{array}} \right).\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
\end{array}} \right)

  • matrices de rotation dans l'espace:

Dans une repère \left( {O,\vec i,\vec j,\vec k} \right) l'operation ci-dessus équivaut à tourner autour du vecteur \vec k c'est à dire l'axe de z.

  1. autour de l'axe des z:

Image:Info_3D_repere_oijk.png \left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \left( {\begin{array}{*{20}c}
   {\cos \beta } & { - \sin \beta } & 0 & 0  \\
   {\sin \beta } & {\cos \beta } & 0 & 0  \\
   0 & 0 & 1 & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right).\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

  1. autour de l'axe des y:

Image:Info_3D_repere_okij.png L’angle de vue du repère à changé ainsi que le nom des axes, cependant par rapprochement on peut deduire: \left. {\begin{array}{*{20}c}
   {\vec i \to \vec k}  \\
   {\vec j \to \vec i}  \\
   {\vec k \to \vec j}  \\
\end{array}} \right\} \Rightarrow \left\{ {\begin{array}{*{20}c}
   {x \to z}  \\
   {y \to x}  \\
   {z \to y}  \\
\end{array}} \right.
On a alors:\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \left( {\begin{array}{*{20}c}
   {\cos \beta } & 0 & {\sin \beta } & 0  \\
   0 & 1 & 0 & 0  \\
   { - \sin \beta } & 0 & {\cos \beta } & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right).\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

  1. autour de l'axe des x:

Image:Info_3D_repere_ojki.png 
\left. {\begin{array}{*{20}c}
   {\vec i \to \vec k}  \\
   {\vec j \to \vec i}  \\
   {\vec k \to \vec j}  \\
\end{array}} \right\} \Rightarrow \left\{ {\begin{array}{*{20}c}
   {x \to z}  \\
   {y \to x}  \\
   {z \to y}  \\
\end{array}} \right.
On a alors: 
\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \left( {\begin{array}{*{20}c}
   1 & 0 & 0 & 0  \\
   0 & {\cos \beta } & { - \sin \beta } & 0  \\
   0 & {\sin \beta } & {\cos \beta } & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right).\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

[modifier] La matrice de translation


\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \left( {\begin{array}{*{20}c}
   1 & 0 & 0 & {T_x }  \\
   0 & 1 & 0 & {T_y }  \\
   0 & 0 & 1 & {T_z }  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right).\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

[modifier] La matrice de mise à l'échelle


\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \left( {\begin{array}{*{20}c}
   {S_x } & 0 & 0 & 0  \\
   0 & {S_y } & 0 & 0  \\
   0 & 0 & {S_z } & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right).\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

[modifier] synthèse M2W


\left[ W \right] = \underbrace {\left[ T \right].\left[ {R_x } \right]....\left[ S \right].\left[ {R_z } \right].\left[ {R_y } \right]}_{M2W}.\left[ M \right]

  • Matrices de rotation


\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \underbrace {\left( {\begin{array}{*{20}c}
   1 & 0 & 0 & 0  \\
   0 & {\cos \beta } & { - \sin \beta } & 0  \\
   0 & {\sin \beta } & {\cos \beta } & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right)}_{R_x }.\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \underbrace {\left( {\begin{array}{*{20}c}
   {\cos \beta } & 0 & {\sin \beta } & 0  \\
   0 & 1 & 0 & 0  \\
   { - \sin \beta } & 0 & {\cos \beta } & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right)}_{R_y }.\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \underbrace {\left( {\begin{array}{*{20}c}
   {\cos \beta } & { - \sin \beta } & 0 & 0  \\
   {\sin \beta } & {\cos \beta } & 0 & 0  \\
   0 & 0 & 0 & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right)}_{R_z }.\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

  • Matrices de translation


\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \underbrace {\left( {\begin{array}{*{20}c}
   1 & 0 & 0 & {T_x }  \\
   0 & 1 & 0 & {T_y }  \\
   0 & 0 & 1 & {T_z }  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right)}_T.\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)

  • Matrices de mise à l'échelle


\left( {\begin{array}{*{20}c}
   {x_B }  \\
   {y_B }  \\
   {z_B }  \\
   1  \\
\end{array}} \right) = \underbrace {\left( {\begin{array}{*{20}c}
   {S_x } & 0 & 0 & 0  \\
   0 & {S_y } & 0 & 0  \\
   0 & 0 & {S_z } & 0  \\
   0 & 0 & 0 & 1  \\
\end{array}} \right)}_S.\left( {\begin{array}{*{20}c}
   {x_A }  \\
   {y_A }  \\
   {z_A }  \\
   1  \\
\end{array}} \right)