每帧调用 glGetUniformLocation()
Posted
技术标签:
【中文标题】每帧调用 glGetUniformLocation()【英文标题】:Calling glGetUniformLocation() every frame 【发布时间】: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() 并重复使用从该返回的值是否会更好。帧率实际上会有任何明显的差异吗?
【问题讨论】:
【参考方案1】:您的统一位置永远不会跨帧改变,因为着色器变量的位置是在“着色器编译时”分配的。因此,如果您将值存储在变量中,您将跳过函数调用......顺便说一下,不要指望有很大的改进;)
【讨论】:
【参考方案2】:实际上,统一的位置将在着色器链接期间分配。并且它们在程序对象的生命周期内永远不会改变。如果你想改进,尽量不要总是更新制服。在您的渲染循环中检查如果统一变量值发生更改,则仅更新其值。一种肮脏的旗帜。这肯定会提高性能。如果您想要更多优化,请查看统一块或统一缓冲区对象的使用。
【讨论】:
以上是关于每帧调用 glGetUniformLocation()的主要内容,如果未能解决你的问题,请参考以下文章
为啥 glGetUniformLocation 让我失望了?
glGetUniformLocation() 在使用过的制服上返回 -1?
即使我在着色器中使用了变量,glGetUniformLocation 仍返回 -1