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

时间:2010-11-17 07:54:26

标签: opengl glsl

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

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

3 个答案:

答案 0 :(得分:59)

嘿,让我们在这里放慢一点:)是的,你通过glGetFloatv(GL_MODELVIEW_MATRIX, ptr)收到矩阵是真的...... 但这绝对不是你应该做的事情! < / p>

让我解释一下:

在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。

答案 1 :(得分:10)

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

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

答案 2 :(得分:1)

float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
相关问题