每帧调用glGetUniformLocation()

时间:2014-04-02 18:59:13

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

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

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()来获取我在着色器中声明为uniform的View矩阵的位置。它是CProgram类的成员函数,它只调用glGetUniformLocation()。因为每个帧都调用它,我想知道在程序开始时只调用一次glGetUniformLocation()并重复使用从中返回的值是否更好。帧率实际上会有明显的差异吗?

2 个答案:

答案 0 :(得分:5)

您的统一位置永远不会在帧之间发生变化,因为着色器变量的位置在"着色器编译时间"中分配。因此,如果您将值存储在变量中,那么您将跳过函数调用....不要期望通过这种方式获得重大改进;)

答案 1 :(得分:0)

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

相关问题