1

我有一些关于屏幕设置的问题。最初,当我画一个三角形时,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();

有任何想法吗?

4

2 回答 2

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)。接下来在您的渲染例程中,您可以绘制三角形

于 2013-06-22T07:05:55.483 回答
0

由于第二段代码对你有用,我假设你的转换矩阵都是恒等的,或者你有一个绕过它们的着色器。您的视口也横跨整个窗口。

通常,如果您的视口从 ( x0,y0) 开始并具有WxH大小,则您输入的标准化坐标 ( 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 四边形,并在此四边形中间评估三角形的覆盖范围。

于 2013-06-22T22:34:07.763 回答