web-dev-qa-db-fra.com

Quand la transition de l'espace du clip aux coordonnées de l'écran a-t-elle lieu?

J'étudiais le pipeline de rendu et lorsque je suis arrivé au stade du découpage, on m'a expliqué que depuis l'espace de visualisation (œil ou caméra), nous devons passer à l'espace de clip, également appelé espace de périphérique normalisé ( NDC), c’est-à-dire un espace cubique compris entre -1 et 1. 

Cependant, maintenant je ne comprends pas quand le passage de cet espace à l'écran de coordonnées d'écran se produit: 

  1. Juste après la coupure et avant la pixellisation? 

  2. Après le rastérisation et avant les ciseaux et le test z? 

  3. A la fin, juste avant d’écrire sur le frame buffer?

30
Geoffrey91

Non, l'espace de clip et l'espace NDC ne sont pas la même chose.

L'espace du clip est en fait à un pas du NDC, toutes les coordonnées sont divisées par Clip.W pour produire le NDC. Tout élément situé en dehors de la plage [-1, 1] dans l'espace NDC résultant correspond à un point situé en dehors du volume de découpage. Il y a une raison pour laquelle l'espace de coordonnées avant NDC s'appelle l'espace de clip;)

À proprement parler, l’espace NDC n’est pas nécessairement cubique. Il est vrai que l'espace NDC est un cube dans OpenGL, mais pas dans Direct3D. Dans D3D, la coordonnée Z dans l'espace NDC va de 0.0 à 1.0, alors qu'elle va de -1.0 à 1.0 dans GL. X et Y se comportent de la même manière dans GL et D3D (c'est-à-dire qu'ils vont de -1.0 à 1.0). NDC est un espace de coordonnées standard, mais sa représentation est différente dans différentes API.

Enfin, l'espace NDC en espace écran (espace de fenêtre AKA) se produit pendant le rastérisation et est défini par votre fenêtre d'affichage et votre plage de profondeur. Les emplacements de fragments n'auraient vraiment aucun sens dans aucun autre espace de coordonnées, et c'est ce que la rastérisation produit: fragments.


Mettre à jour:

Introduit dans OpenGL 4.5, l’extension GL_ARB_clip_control vous permet d’adopter la convention NDC de D3D en GL.

Le comportement OpenGL traditionnel est:

glClipControl (GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE);

Le comportement de Direct3D peut être obtenu via:

glClipControl (GL_UPPER_LEFT, GL_ZERO_TO_ONE); // Y-axis is inverted in D3D
41
Andon M. Coleman

L'espace du clip et les NDC (coordonnées normalisées de l'appareil) ne sont pas la même chose, sinon ils n'auraient pas des noms différents. 

L'espace du clip est l'endroit où se trouvent les points de l'espace après la transformation du point par la matrice de projection, mais avant la normalisation par w

NDC space correspond aux points d'espacement après la normalisation de w

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orth-projection-matrix/projection-matrix-GPU-rendering-pipeline-clipping

Camera space --> 
x projection matrix ---> 
Clip space (before normalisation) --->
Clipping ---> 
Normalisation by w (x/w, y/w, z/w) --->
NDC space (in the range [-1, 1] in x and y)
10
user18490

Apparemment, selon Apple, l’espace de découpe est identique à NDC.

https://developer.Apple.com/documentation/metal/hello_triangle

Citation: 

"La tâche principale d'une fonction de sommet (appelée également sommet de vertex) consiste à traiter les données de sommet entrantes et à mapper chaque sommet à une position dans la fenêtre. Ainsi, les étapes suivantes du pipeline peuvent faire référence à cette position et restituer des pixels. La fonction de sommet accomplit cette tâche en traduisant des coordonnées de sommet arbitraires en coordonnées de périphérique normalisées, également appelées coordonnées d’espace de découpe. "

Une autre citation de commentaires dans l'exemple de code:

"La position de sortie de chaque vertex shader est dans l'espace de découpage (également appelé espace de coordonnées de périphérique normalisé ou NDC)."

C'est peut-être parce que le tutoriel est en 2D? Déclarations trompeuses ..

1
Siamaster

L'espace NDC est l'espace de clips, l'espace NDC dans l'espace de la fenêtre est effectué par le matériel, après NDC et avant le rastérisation. 

Il existe une API pour définir la largeur et la hauteur, la valeur par défaut est identique à la taille de la fenêtre.

// metal
func setViewport(_ viewport: MTLViewport)
// OpenGL
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

Espace NDC pour OpenGL, plage xyz [-1, 1]. Pour le métal, Z est compris entre 0 et 1

L'espace NDC est généralement le système main gauche. 

0
lbsweek