Question

Voici mes paramètres pour OpenGL, au cas où ils comptent:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

Pendant un certain temps, j'ai pensé que les plans d'écrêtage s'appliqueront à tout pour lequel GL_POSITION.Z est à l'extérieur -1 à 1. Mais même lorsque je force GL_POSITION.Z à un nombre constant dans le shader:

gl_Position.z = -0.01;

Il y a encore du tampon z correct et de l'écrêtage basé sur GL_POSITION.W! Alors quelles sont les règles?

Était-ce utile?

La solution

La valeur de GL_POSITION est dans ce que OpenGL appelle "Clip Space". C'est un Système de coordonnées homogènes. En particulier, les étendues XYZ de l'espace clip sont [-W, + W]. Ainsi, chaque sommet est dans son propre espace clip.

Je ne sais pas exactement ce que vous entendez par «quelles sont les règles». La GL_POSITION à l'espace de clip est coupée contre la zone de vue dans l'espace homogène. Ils sont donc coupés dans la région [-W, + W] pour chaque sommet. Il est difficile d'imaginer que dans un espace homogène projectif, mais les mathématiques fonctionnent, donc cela n'a pas d'importance.

Après cela, les sommets coupés sont transformés en espace de coordonnées de l'appareil normalisé (NDC). Cela signifie diviser le XYZ de l'espace clip par W. Tous ces sommets sont dans la gamme [-1, 1].

De là, la transformation de la fenêtre se produit. La glViewport Les paramètres évoluent les sommets de l'espace [-1, 1] NDC à la région de la fenêtre. Cela transforme les points en espace de fenêtre; C'est dans l'espace des fenêtres qu'ils sont rastérisés.

Le xy de l'espace de fenêtre est contrôlé par glViewport. Les valeurs z pour l'espace de fenêtre sont contrôlées par glDepthRange. La plage de profondeur par défaut est une valeur quasi de 0 et une valeur éloignée de 1 (avertissement: la matrice de perspective proche / lointaine les plans ont rien en commun avec la plage de profondeur. Ne confondez pas les deux). Il mappe donc le [-1, 1] de l'espace Z dans le NDC à [près, loin] dans l'espace des fenêtres.

Ce sont des «règles».

Autres conseils

Vous utilisez GLClearDepth (1.0F); GLENABLE (gl_depth_test); gldepthfunc (gl_lequal);

Le tampon de profondeur a une valeur comprise entre 0 et 1 (profondeur maximale), utilisez GL_LEQUAL, ce qui signifie que tout serait attiré par l'écran car la valeur de profondeur serait inférieure ou égale à 1.

Pour plus de clarté, visitez:http://www.zeuscmd.com/tutorials/opengl/11-depth.php

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top