OpenGL屏幕布局

OpenGL screen layout

本文关键字:布局 屏幕 OpenGL      更新时间:2023-10-16

我对屏幕设置有一些问题。最初,当我画一个三角形时,x向量1会一直向右,-1会一直向左。现在我已经对它进行了调整,以适应窗口的不同纵横比。我的新问题是,如何使用于渲染二维三元图的数字与像素值一起使用。如果我的窗口是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();

有什么想法吗?

您需要使用具有正确值的函数glViewport和glOrtho。基本上,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 );

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

由于第二段代码适用于您,我假设您的变换矩阵都是同一矩阵,或者您有一个绕过它们的着色器。此外,您的视口将覆盖整个窗口。

通常,如果视口从(x0,y0)开始,大小为W x H,则提供给glVertex2f的标准化坐标(x,y)将转换为(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四边形,并评估该四边形中间三角形的覆盖范围。