2011-11-19 319 views
4

我似乎有一个好奇的问题。我设置了OpenGL的是这样的:在GLSL顶点着色器中使用正确的坐标系

glViewport(0, 0, width, height); 

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

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

显然,宽度和高度都是我的窗口,它是由600 400里面的OpenGL一切正常的大小,我可以正确的坐标系中移动。即无论是以200个像素绘制,平移200个移动。现在

,我的顶点着色器里我似乎无法使用同一个坐标系,我做平常:

vec4 pos = gl_ModelViewProjectionMatrix * gl_Vertex; 
gl_Position = pos; 

中的main(),一切似乎要被罚款。但是,当我尝试这样的事情:

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

顶点位置在每个方向上不是由1个像素翻译,而是在x中是300,在y中是200。

我明白我可以在着色器内缩放这些值,但看起来有点脏。当然,我必须在设置中做错了什么。任何帮助深表感谢。

回答

3

您正在应用之后的[+1,-1]翻译转换。 -1 < = x < = 1,-1 < = y < = 1对应于此转换后的视口边缘,这就是为什么您会获得宽度/ 2和高度/ 2的增量。

9

gl_Position输出的位置不是屏幕空间。这是剪辑空间。剪辑空间在每个方向从-1到1 之后隐含/ w分割。 glOrtho将变换应用于投影,这会将[0,800] x [0,600]范围内的坐标偏移/缩放为[-1,1]。

屏幕空间像素转换通过视口转换发生。它是将NDC坐标(这些是一个小的但是在剪辑坐标之后的重要步骤)与窗口尺寸相关联的视口。投影并不需要依赖视口尺寸(当然,如果想要按像素放置东西,则使用映射眼睛空间坐标来映射像素空间的投影是合意的)。

相关问题