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

Ale*_*319 27 opengl glsl

我试图使用OpenGL着色语言(GLSL)1.5版来制作顶点和几何着色器.

我已经了解到在GLSL 1.5版中,gl_ModelViewProjectionMatrix不推荐使用内置变量,所以你必须手动传递它们.如果我已经设置了模型视图和投影矩阵(使用gluLookAtgluPerspective例如),那么如何让矩阵传递到顶点和几何着色器?我做了一些搜索,一些网站似乎提到了一个函数glGetMatrix(),但我在任何官方文档中找不到该函数,并且它似乎不存在于我正在使用的实现中(unknown identifier: glGetMatrix当我得到编译错误时)尝试用该函数编译它).

Kos*_*Kos 59

嘿,让我们在这里放慢一点:)是的,你收到矩阵的确如此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
Run Code Online (Sandbox Code Playgroud)

所以,长话短说 - 不推荐使用着色器内置制服,因为OpenGL中的相应功能也已弃用; 要么是更高版本的OpenGL,要么是较低版本的GLSL.


erg*_*sys 10

要获得任一矩阵,请使用常量GL_MODELVIEW_MATRIX或GL_PROJECTION_MATRIX和glGetxxxx:

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
Run Code Online (Sandbox Code Playgroud)