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

Creating Shapes Relative to World Position, Not Screen Position

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

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

请注意,glBegin/glEnd sequences and the fixed function matrix stack is deprecated since decades. See Fixed Function Pipeline and Legacy OpenGL 绘制的那幅画。 阅读 Vertex Specification and Shader 了解最先进的渲染方式。


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

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

一个orthographic projection can be set up by glOrtho:

例如:

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

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