【问题标题】:How do you get the modelview and projection matrices in OpenGL?如何在 OpenGL 中获得模型视图和投影矩阵?
【发布时间】:2011-05-11 06:55:33
【问题描述】:

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

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

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

    嘿,让我们在这里放慢一点 :) 是的,您确实收到了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 矩阵。这样做的新范式是什么?
    • 如果你想要一个 GL3+ 中的矩阵栈,创建一个std::vector<matrix> 并用glUniformMatrix4fv 传递最顶层的矩阵对象。您可以拥有多个,并且可以决定如何在着色器中使用每个。
    • @Nigel。 折旧表示价值损失,通常以货币形式表示。 Deprecated 表示已过时。两个非常不同的术语。请明智地使用:)
    • 啊! Khronos 的人有什么问题?他们一次又一次地表明他们不理解“弃用”的含义。它应该是当你有一个更好的功能替代品时你做的事情,但他们反复使用它来让我们的事情更糟,取而代之的是用过的东西“只是工作”并将其倾倒在我们的圈子中以手动重新实施,如果这甚至可能的话。 (例如,我还没有看到 GL_QUADS 的好替代品!)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      float modelview[16];
      glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多