2011-11-19 4 views
4

Je semble avoir un curieux problème. Je mis en place OpenGL comme ceci:Utilisation du système de coordonnées correct dans le vertex shader de GLSL

glViewport(0, 0, width, height); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0, width, height, 0, -width, width); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

De toute évidence, la largeur et la hauteur sont la taille de ma fenêtre, qui est de 600 par 400. tout à l'intérieur OpenGL est très bien, je peux me déplacer dans le système de coordonnées correct. c'est-à-dire traduire par 200 coups tout ce qui est dessiné par 200 pixels.

Maintenant, dans mon vertex shader je ne peux pas sembler utiliser le même système de coordonnées, je l'habituel:

vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; 
gl_Position = pos; 

intérieur main() et tout semble bien. Cependant, lorsque je tente quelque chose comme ceci:

vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; 
pos.x+= 1.0; 
pos.y-= 1.0; 
gl_Position = pos; 

Les positions des sommets sont convertis non par 1 pixel dans chaque direction, mais par 300 x et 200 dans le y. Je comprends que je pourrais mettre à l'échelle ces valeurs dans le shader, mais cela semble un peu sale. Je dois sûrement faire quelque chose de mal dans la configuration. Toute aide est très appréciée.

Répondre

3

Vous appliquez la traduction [+1, -1] après la transformation. -1 < = x < = 1, -1 < = y < = 1 correspondent aux bords de la fenêtre après cette transformation, ce qui explique pourquoi vous obtenez des incréments de largeur/2 et hauteur/2.

9

La position fournie par gl_Position n'est pas un espace d'écran. C'est l'espace de clip. L'espace de clip va de -1 à 1 dans chaque direction après une division implicite/w. glOrtho applique une transformation à la projection, qui décalera/mettra à l'échelle les coordonnées de [0, 800] x [0,600] à [-1,1].

La transformation en pixels de l'espace écran s'effectue via la transformation de la fenêtre. C'est la fenêtre d'affichage qui relie les coordonnées NDC (celles-ci sont un petit, mais important après les coordonnées du clip) aux dimensions de votre fenêtre. La projection et non nécessaire de dépendre des dimensions de la fenêtre (bien sûr si l'on veut placer les choses par pixel, puis en utilisant une projection qui cartographie les coordonnées de l'espace de l'oeil pour l'écran de l'espace pixel est souhaitable).

Questions connexes