首先,OpenGL使用多个坐标系,所以没有“ OpenGL坐标系”。您指的是标准化设备坐标 (NDC),其中所有三个坐标都在 [-1, 1] 范围内。不同的坐标系及其名称在“9.011 如何转换坐标?有哪些不同的坐标空间?”一节中进行了解释。1)
其次,为避免混淆,在 OpenGL 中,术语“视口”指的是您要渲染到的窗口部分,它位于窗口坐标中。在您的问题中,您使用它来描述您想要渲染的世界的部分 (l,r,t,b)=(-500, -500, 1200, 1200),它位于世界坐标中。
您问如何“计算在屏幕上绘制对象的位置”。您需要做的是定义一个从一个坐标系映射到另一个坐标系的变换(一个 4x4 矩阵)。您的 2D 世界以世界坐标给出,因此您需要定义一个将世界坐标转换为 NDC 的矩阵,即投影矩阵。然后,在您的着色器中,您只需将顶点与此投影矩阵相乘,即可获得 NDC。glm::ortho
/glOrtho
计算这样一个投影矩阵。至于透视投影,不清楚你想做什么,但你应该试验一下glm中的perspective
andlookat
函数。
为了清楚起见,您可以在任何您想要的坐标系(称为世界坐标系)中定义顶点,然后简单地绘制这些顶点。您的顶点着色器的工作是应用您定义的转换。
另请注意,您指定了一个正方形,通常这不是您想要的。监视器和大多数窗口都不是正方形的,因此如果您将该正方形映射到一个典型的视口上,您会得到一个扭曲的世界视图。您需要考虑视口的纵横比(宽度:高度)。我试图在这里解释。
1) 作为旁注,FAQ 相当陈旧,指的是 OpenGL 的古老版本。如今,人们期望并鼓励程序员自己管理模型视图和投影矩阵,因为您需要在着色器中使用它们。我强烈推荐glm,它只是标题,因此非常容易集成,并且具有反映 GLSL 的漂亮语法。