创建相对于世界位置而不是屏幕位置的形状

时间:2019-02-04 16:57:45

标签: c++ opengl glm-math

我是OpenGL的新手,正在寻求创建2D游戏。我发现了如何使用glBegin()glVertex2f()glEnd()创建形状。但是,当我使用它时,它使用屏幕位置作为坐标(当我使用非正方形显示时,形状会被拉伸)。

所以我想知道的是,我将如何相对于世界位置创建形状,以使它不会延伸到屏幕上(可能是glm::vec2)?

1 个答案:

答案 0 :(得分:0)

请注意,数十年来不赞成使用glBegin/glEnd序列和固定函数矩阵堆栈进行绘制。请参见Fixed Function PipelineLegacy OpenGL。 了解有关Vertex SpecificationShader的最新渲染方式。


在OpenGL中,范围[-1,1]中的规范化设备坐标被映射到视口。投影矩阵将顶点坐标从视图空间转换为剪辑坐标。通过将剪辑坐标的w分量除以将这些剪辑坐标转换为归一化设备坐标(NDC)。

默认情况下,固定功能矩阵堆栈上的投影矩阵是单位矩阵。这导致视图空间坐标到规范化设备坐标的1:1映射。如果视口是矩形的,则在设置投影矩阵时必须考虑这一点。

orthographic projection可以由glOrtho设置:

例如:

double aspect = (double)width/(double)height;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-aspect, aspect, -1.0, 1.0, -1.0, 1.0);