2013-06-22 126 views
1

我有关于屏幕设置的一些问题。最初,当我绘制一个三角形时,x向量1将一直向右,-1会一直向左。现在我已经调整了它,以考虑窗口的不同宽高比。我的新问题如何使用于渲染二维三角的数字以及像素值。如果我的窗口是480个像素宽,320高的我想要进入这个跨越的屏幕采用了三OpenGL屏幕布局

glBegin(GL_TRIANGLES); 
    glVertex2f(240, 320); 
    glVertex2f(480, 0); 
    glVertex2f(0, 0); 
glEnd(); 

而是它目前看起来像这样

glBegin(GL_TRIANGLES); 
    glVertex2f(0, 1); 
    glVertex2f(1, -1); 
    glVertex2f(-1, -1); 
glEnd(); 

任何想法?

+0

http://stackoverflow.com/questions/17056733/using-opengl-for-2d – Grimmy

+0

http://stackoverflow.com/questions/5877728/want-an-opengl-2d-example-vc-draw-a -长方形 – mr5

回答

1

您需要使用具有正确值的功能glViewportglOrtho。基本上glViewport设置窗口的一部分能够使用OpenGL渲染3D图形。 glOrtho使用OpenGL的坐标在窗口的该部分内建立坐标系。 因此,为了您的任务,您需要知道窗口的确切宽度和高度。如果你说他们是480和320分别然后你需要调用

glViewport(0, 0, 480, 320) 
// or: glViewport (0,0,w,h) 

某处,也许在你的SizeChanging处理程序(如果您正在使用WINAPI是WM_SIZE消息)

其次,建立的OpenGL时的场景你需要指定OpenGL的坐标。对于正射投影,它们将与窗户的尺寸相同,因此

glOrtho(-240, 240, -160, 160, -100, 100) 
// or: glOrtho (-w/2, w/2, -h/2, h/2, -100, 100); 

适合你的purppose。不是说我在这里使用200的深度(z从-100到100)。 接下来,在您的渲染例程中,您可以绘制您的三角形

0

由于第二段代码适合您,因此我假设您的转换矩阵都是标识,或者您有绕过它们的着色器。此外,您的视口跨越整个窗口。

一般来说,如果你的视口开始于(x0,y0),并具有W X H尺寸,归一化坐标(x,y)你喂glVertex2f将会转化成(vx,vy)如下:

vx = x0 + (x * .5f + .5f) * W 
vy = y0 + (y * .5f + .5f) * H 

如果您想要使用像素坐标,您可以使用该功能

void vertex2(int x, int y) 
{ 
    float vx = (float(x) + .5f)/480.f; 
    float vy = (float(y) + .5f)/320.f; 
    glVertex3f(vx, vy, -1.f); 
} 

-1 z值是距离观察者最近的深度。这是负面的,因为z被认为是在转换后反映出来的(这是你的情况)。 .5f的添加是因为光栅化器将一个像素视为1x1四边形,并在该四边形中间评估三角形的覆盖范围。