【问题标题】:Calling glGetUniformLocation() every frame每帧调用 glGetUniformLocation()
【发布时间】:2014-04-02 18:59:12
【问题描述】:

我有一个使用着色器和顶点缓冲区对象的 OpenGL 应用程序,以及用于矩阵和向量的 GLM。因为每帧都会发生矩阵变换,所以我每帧都调用 glUniformMatrix4fv() 。以下是我的代码的 sn-p:

ViewMatrix = glm::rotate(glm::mat4(1.0f), glm::radians(YRotation), glm::vec3(0.0f, 1.0f, 0.0f)) * ViewMatrix;
ViewMatrix = glm::rotate(glm::mat4(1.0f), glm::radians(XRotation), glm::vec3(1.0f, 0.0f, 0.0f)) * ViewMatrix;
ViewMatrix = glm::translate(glm::mat4(1.0f), Translate) * ViewMatrix;

...

glUniformMatrix4fv(ShaderProgram->GetUniformLocation("View"), 1, GL_FALSE, glm::value_ptr(ViewMatrix));

如图所示,我调用 GetUniformLocation() 来获取我在着色器中声明为统一的 View 矩阵的位置。它是CProgram 类的成员函数,它简单地调用glGetUniformLocation()。因为每帧都会调用它,所以我想知道在程序开始时只调用一次 glGetUniformLocation() 并重复使用从该返回的值是否会更好。帧率实际上会有任何明显的差异吗?

【问题讨论】:

    标签: c++ opengl matrix 3d glm-math


    【解决方案1】:

    您的统一位置永远不会跨帧改变,因为着色器变量的位置是在“着色器编译时”分配的。因此,如果您将值存储在变量中,您将跳过函数调用......顺便说一下,不要指望有很大的改进;)

    【讨论】:

      【解决方案2】:

      实际上,统一的位置将在着色器链接期间分配。并且它们在程序对象的生命周期内永远不会改变。如果你想改进,尽量不要总是更新制服。在您的渲染循环中检查如果统一变量值发生更改,则仅更新其值。一种肮脏的旗帜。这肯定会提高性能。如果您想要更多优化,请查看统一块或统一缓冲区对象的使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 2020-06-25
        相关资源
        最近更新 更多