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