OpenGL屏幕布局

时间:2013-06-22 06:50:14

标签: c++ opengl

我对屏幕设置有一些疑问。最初当我绘制一个三角形时,x向量1将一直向右,-1将一直向左。现在我已经调整它以考虑窗口的不同宽高比。我的新问题如何使用于渲染2d tri的数字与像素值一起使用。如果我的窗口是480像素宽和320高,我想要输入这个以跨三个

跨越屏幕
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();

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

某处,也许在你的SizeChanging-handler中(如果你使用的是WINAPI,那就是WM_SIZE消息)

接下来,在建立OpenGL场景时,您需要指定OpenGL的坐标。对于正交投影,它们将与窗口的尺寸相同,所以

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

可以满足您的需求。不是在这里我使用200的深度(z从-100到100)。 在渲染例程中,您可以绘制三角形

答案 1 :(得分: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四边形,并在此四边形的中间评估三角形的覆盖范围。