我对屏幕设置有一些疑问。最初当我绘制一个三角形时,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();
有什么想法吗?
答案 0 :(得分:1)
您需要使用具有正确值的函数glViewport和glOrtho。基本上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四边形,并在此四边形的中间评估三角形的覆盖范围。