C++ OpenGL屏幕布局
我有一些关于屏幕设置的问题。最初,当我画一个三角形时,x向量1会一直向右,-1会一直向左。现在我已经调整了它,以考虑到窗口的不同纵横比。我的新问题是如何使用于渲染2d tri的数字与像素值一致。如果我的窗口是480像素宽,320像素高,我想我必须输入这个,以跨越屏幕与一个三C++ OpenGL屏幕布局,c++,opengl,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(240, 320);
glVertex2f(480, 0);
glVertex2f(0, 0);
glEnd();
但是现在看起来是这样的
glBegin(GL_TRIANGLES);
glVertex2f(0, 1);
glVertex2f(1, -1);
glVertex2f(-1, -1);
glEnd();
有什么想法吗?您需要使用函数和正确的值。基本上glViewport
设置窗口中能够使用OpenGL渲染三维图形的部分glOrtho
使用OpenGL的坐标在窗口的该部分建立坐标系。
所以,对于你们的任务,你们需要知道你们窗户的确切宽度和高度。如果你说他们分别是480和320,那么你需要打电话
glViewport(0, 0, 480, 320)
// or: glViewport ( 0,0,w,h)
在某个地方,可能在SizeChange处理程序中(如果您使用的是WINAPI,则是WM_大小消息)
接下来,在建立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)。
接下来在渲染例程中,您可以绘制三角形您需要使用函数和正确的值。基本上glViewport
设置窗口中能够使用OpenGL渲染三维图形的部分glOrtho
使用OpenGL的坐标在窗口的该部分建立坐标系。
所以,对于你们的任务,你们需要知道你们窗户的确切宽度和高度。如果你说他们分别是480和320,那么你需要打电话
glViewport(0, 0, 480, 320)
// or: glViewport ( 0,0,w,h)
在某个地方,可能在SizeChange处理程序中(如果您使用的是WINAPI,则是WM_大小消息)
接下来,在建立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
xH
大小,则您馈送到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个四元组,并在这个四边形中评估三角形的覆盖范围。 ,因为第二段代码为您工作,我假设您的转换矩阵都是同一个,或者您有一个绕过它们的着色器。您的视口也跨越了整个窗口 通常,如果视口从(
x0,y0
)开始并具有W
xH
大小,则您馈送到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个四元组,并评估在这个四边形中三角形的覆盖范围。