Opengl中的状态管理器

31 阅读1分钟

由于opengl的缓冲区是全局唯一的,容易出现重复绑定的情况,状态管理器就是为了解决重复绑定的情况,提高性能。 以下是一个基础的状态管理器代码:

class OpenGLStateManager {
private:
    static unsigned int s_BoundArrayBuffer;     // 记录当前绑定的VBO ID
    static unsigned int s_BoundElementBuffer;  // 记录当前绑定的EBO ID
    static unsigned int s_BoundVertexArray;    // 记录当前绑定的VAO ID
    static unsigned int s_BoundShaderProgram;  // 记录当前绑定的着色器程序ID
    
public:
    static void BindArrayBuffer(unsigned int id) {
        if (s_BoundArrayBuffer != id) {  // 关键:检查是否真的需要绑定
            glBindBuffer(GL_ARRAY_BUFFER, id);
            s_BoundArrayBuffer = id;     // 更新缓存的ID
        }
        // 如果ID相同,跳过OpenGL调用
    }
};

在重复渲染100个相同对象时,状态管理器的作用尤为明显,可以将100次绑定减少至一次绑定。