在OpenGL中如何获取模型视图矩阵和投影矩阵?

30

我正在尝试使用OpenGL着色语言(GLSL) 1.5版本制作顶点和几何着色器。

我了解到在GLSL 1.5版本中,像gl_ModelViewProjectionMatrix这样的内置变量被弃用了,所以你必须手动传递它们。如果我已经设置了模型视图和投影矩阵(例如使用gluLookAtgluPerspective),那么我该如何获取这些矩阵并传递给顶点和几何着色器呢?我进行了一些搜索,一些网站似乎提到了一个glGetMatrix()函数,但我在任何官方文档中都找不到这个函数,并且在我使用的实现中似乎不存在这个函数(当我尝试编译带有该函数的代码时,会出现编译错误未知标识符:glGetMatrix)。

3个回答

61

嘿,我们慢下来吧 :) 是的,通过glGetFloatv(GL_MODELVIEW_MATRIX, ptr)可以获取矩阵...但这绝对不是你应该在这里做的事情!

让我解释一下:

在GLSL中,像gl_ModelViewProjectionMatrix这样的内置变量或ftransform()这样的函数已经被弃用了 - 是的,但这仅仅是因为整个矩阵堆栈在GL 3.x中被弃用了,你应该使用自己的矩阵堆栈(或者使用任何其他解决方案,矩阵堆栈虽然有帮助但不是必须的!)。

如果你仍在使用矩阵堆栈,那么你就依赖于OpenGL 2.x或1.x中的功能。这没关系,因为由于GL兼容性配置文件的存在,现代显卡仍然支持所有这些功能 - 虽然切换到新的GL版本很好,但是现在你可以继续使用这个版本。

但是如果你正在使用旧版的OpenGL(带有矩阵堆栈),也请使用旧版的GLSL。尝试使用1.2版本,因为更高的版本(包括你的1.5版本)是为与OpenGL3兼容而设计的,其中投影或模型视图矩阵在OpenGL中已不再存在,并且如果需要,则应将它们作为自定义的uniform变量显式传递。

OpenGL和GLSL版本之间的对应关系以前有点棘手(在他们整理版本编号之前),但现在应该更或多或少相似:

GL    GLSL

4.1 - 4.1
4.0 - 4.0
3.3 - 3.3
3.2 - 1.5
3.1 - 1.4
3.0 - 1.3
2.x and lower - 1.2 and lower

简单来说,着色器的内置统一变量已经被废弃,因为OpenGL中相应的功能也已被废弃。要么选择更高版本的OpenGL,要么选择更低版本的GLSL。


由于矩阵堆栈已经被弃用,我不确定新的方法应该是什么。在我们的旧代码中,我们对实例化对象应用变换,并从一个公共函数中渲染每个对象。现在似乎需要在每次变换后手动更新modelView矩阵才能使其正常工作。那么现在做这件事的新范式是什么? - Nigel
1
如果你想在GL3+中使用矩阵堆栈,可以创建一个std::vector<matrix>,并使用glUniformMatrix4fv传递最顶部的矩阵对象。你可以创建多个矩阵堆栈,并且能够决定如何在着色器中使用每一个。 - Kos
@Nigel。"Depreciated" 意味着价值下降,通常是指货币方面的。"Deprecated" 意味着过时了。两个非常不同的术语。请明智使用 :) - Engineer
1
啊!Khronos的人到底怎么了?他们一次又一次地表明他们不理解“弃用”的含义。它应该是当你有更好的替代功能时才会这样做,但他们反复使用它来让我们的事情变得更糟,把过去“只需工作”的东西丢给我们手动重新实现,如果可能的话。(例如,我仍然没有看到GL_QUADS的一个好替代品!) - Mason Wheeler

11

你可以使用 glGetxxxx 函数和常量 GL_MODELVIEW_MATRIX 或 GL_PROJECTION_MATRIX,来获取任一矩阵:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 

2
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接