首页 > 解决方案 > 创建相对于世界位置而非屏幕位置的形状

问题描述

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

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

标签: c++openglglm-math

解决方案


请注意,由glBegin/glEnd序列绘制和固定函数矩阵堆栈自几十年以来已被弃用。请参阅固定功能管道旧版 OpenGL。阅读有关顶点规范着色器的信息,了解最先进的渲染方式。


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

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

可以通过以下方式设置正交投影glOrtho

例如:

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

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

推荐阅读