Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL屏幕布局_C++_Opengl - Fatal编程技术网

C++ OpenGL屏幕布局

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(); 但是现在看起来

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

您需要使用函数和正确的值。基本上
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
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个四元组,并在这个四边形中评估三角形的覆盖范围。

,因为第二段代码为您工作,我假设您的转换矩阵都是同一个,或者您有一个绕过它们的着色器。您的视口也跨越了整个窗口

通常,如果视口从(
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个四元组,并评估在这个四边形中三角形的覆盖范围。