Domanda

Ecco le mie impostazioni per opengl, nel caso siano importanti:

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);

Per un po 'ho pensato che i piani di ritaglio si applicassero a tutto ciò per cui gl_Position.z è esterno a -1 a 1. Ma anche quando forzo gl_Position.z su un numero costante nello shader:

gl_Position.z = -0.01;

Ci sono ancora z-buffering e clipping corretti basati su gl_Position.w!Allora quali sono le regole?

È stato utile?

Soluzione

Il valore di gl_Position è in quello che OpenGL chiama "spazio di clip". È un sistema di coordinate omogeneo . In particolare, le estensioni XYZ dello spazio della clip sono [-W, + W]. Quindi ogni vertice si trova nel proprio spazio di clip.

Non sono sicuro di cosa intendi esattamente con "quali sono le regole". Il clip-space gl_Position viene ritagliato sull'area di visualizzazione in uno spazio omogeneo. Quindi vengono ritagliati sulla regione [-W, + W] per ogni vertice. È difficile immaginarlo in uno spazio proiettivo omogeneo, ma la matematica funziona, quindi non importa.

Dopodiché, i vertici ritagliati vengono trasformati in uno spazio NDC (normalized device coordinate). Ciò significa dividere l'XYZ dello spazio della clip per W. Tutti questi vertici sono nell'intervallo [-1, 1].

Da lì, avviene la trasformazione del viewport. I parametri glViewport scalano i vertici dallo spazio NDC [-1, 1] alla regione del viewport. Questo trasforma i punti nello spazio della finestra; è nello spazio della finestra che vengono rasterizzati.

L'XY dello spazio della finestra è controllato da glViewport. I valori Z per lo spazio della finestra sono controllati da glDepthRange. L'intervallo di profondità predefinito è un valore vicino di 0 e un valore lontano di 1 (ATTENZIONE: i piani vicino / lontano della matrice prospettica hanno nulla in comune con l'intervallo di profondità. Non confondere i due). Quindi mappa [-1, 1] della Z nello spazio NDC a [near, far] nello spazio della finestra.

Queste sono "le regole".

Altri suggerimenti

Tu usi glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);

Depth Buffer ha un valore compreso tra 0 e 1 (profondità massima), utilizzare ha scelto GL_LEQUAL, il che significa che tutto verrà disegnato sullo schermo poiché il valore della profondità sarebbe inferiore o uguale a 1.

Per maggiore chiarezza, visita: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top