我想只使用现代 OpenGL 技术(即没有即时模式的东西)设置一个正交投影。我在网上看到有关如何解决此问题的相互矛盾的信息。
有人说还是可以打电话glMatrixMode(GL_PROJECTION)
then glOrtho
。这在过去一直对我有用,但我想知道这在现代 OpenGL 中是否已被弃用。
如果是这样,顶点着色器是当今进行正交投影的标准方法吗?GLSL 是否提供了一个方便的内置函数来设置正交投影,还是我需要自己在顶点着色器中编写该数学?
我想只使用现代 OpenGL 技术(即没有即时模式的东西)设置一个正交投影。我在网上看到有关如何解决此问题的相互矛盾的信息。
有人说还是可以打电话glMatrixMode(GL_PROJECTION)
then glOrtho
。这在过去一直对我有用,但我想知道这在现代 OpenGL 中是否已被弃用。
如果是这样,顶点着色器是当今进行正交投影的标准方法吗?GLSL 是否提供了一个方便的内置函数来设置正交投影,还是我需要自己在顶点着色器中编写该数学?
如果是这样,顶点着色器是当今进行正交投影的标准方法吗?
不完全的。顶点着色器执行计算,但变换矩阵通常通过统一输入着色器。着色器应该只评估随每个顶点变化的事物。实现“正交”函数,在 GLSL 中返回投影矩阵会适得其反。
我想只使用现代 OpenGL 技术(即没有即时模式的东西)设置一个正交投影。我在网上看到有关如何解决此问题的相互矛盾的信息。
版本 3 之前的 OpenGL 的矩阵堆栈与立即模式无关。立即模式是glBegin(…); for(…){ ...; glVertex(…);} glEnd()
。直到 OpenGL 版本 3,在顶点着色器中使用通过矩阵堆栈指定的矩阵是相当普遍的。
使用 OpenGL-3,它的目标是做 OpenGL-2 的最初计划:统一 API 并删除旧的垃圾。删除的其中一项是矩阵堆栈。无论如何,许多着色器已经使用了比标准矩阵更多的东西(例如用于骨骼动画),因此矩阵已经作为统一传递,并且程序确实已经包含整个矩阵数学代码。采取从 OpenGL-3 中删除矩阵数学的步骤只是下一个合乎逻辑的步骤。
通常,您不会在着色器中计算矩阵。您在 CPU 上计算它们并将它们作为 s 上传uniform
到着色器。因此,您的顶点着色器既不知道也不关心它是用于正交投影还是透视投影。它只是通过给定的任何投影矩阵进行转换。
当您以 OpenGL 版本 > 3.0 为目标时,glOrtho 已从官方规范中删除(但仍存在于兼容性配置文件中),因此您不应再使用它。因此,您必须直接在顶点着色器中计算要使用的投影(对于 OpenGL,最高 3.0 glOrtho 完全可以;)。
而且没有“方便”的函数来获取 GLSL 中的投影矩阵,所以你必须自己指定它。但是,这没有问题,因为 a) 网络中有大量示例代码,并且 b) 方程式在 OpenGL 规范中是正确的,因此如果您愿意,可以从那里简单地获取它。