C++ 高效地绘制多个opengl元素

C++ 高效地绘制多个opengl元素,c++,opengl,2d,C++,Opengl,2d,我目前正在学习opengl,并开始制作自己的2D引擎。到目前为止,我已经使用gldraurements()渲染了一个由两个三角形组成的矩形,并将其应用于自定义着色器 到目前为止,我的代码是这样的: #include <all> int main() { Window window("OpenGL", 800, 600); Shader shader1("./file.shader"); float vt[8] = {-0.5f, -0.5f, 0.5

我目前正在学习opengl,并开始制作自己的2D引擎。到目前为止,我已经使用
gldraurements()
渲染了一个由两个三角形组成的矩形,并将其应用于自定义着色器

到目前为止,我的代码是这样的:

#include <all>

int main() {
    Window window("OpenGL", 800, 600);
    Shader shader1("./file.shader");

    float vt[8] = {-0.5f, -0.5f,    0.5f, -0.5f,     0.5f, 0.5f,    -0.5f, 0.5f };
    const GLuint indices[6] = { 0, 1, 2, 2, 3, 0 };

    GLuint vao, vbo, ebo;
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vt), vertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);

    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);


    while(window.isOpen()) {
        window.clear(0.0, 0.5, 1.0);

        shader1.use();
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, NULL);

        window.update();
    }

    /* glDeleteStuffs */
}
#包括
int main(){
窗口(“OpenGL”,800600);
着色器shader1(“./file.Shader”);
浮点数vt[8]={0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f};
const-GLuint指数[6]={0,1,2,2,3,0};
GLuint vao、vbo、ebo;
glGenVertexArrays(1和vao);
glBindVertexArray(vao);
glGenBuffers(1,&vbo);
glBindBuffer(GL_数组_BUFFER,vbo);
glBufferData(GLU数组缓冲区、大小(vt)、顶点、GLU静态图);
GlenableVertexAttributeArray(0);
glvertexattributepointer(0,2,GL_FLOAT,GL_FALSE,0,0);
glGenBuffers(1和ebo);
glBindBuffer(GLU元素数组缓冲区,ebo);
glBufferData(GL元素\数组\缓冲区、sizeof(索引)、索引、GL静态\绘图);
while(window.isOpen()){
窗口。清除(0.0,0.5,1.0);
shader1.use();
gld元素(GL_三角形,6,GL_无符号,NULL);
window.update();
}
/*GLDeleteStuff*/
}

有多种方法可以做到这一点,但我听说一个接一个地绘制和切换着色器非常昂贵。我希望在一个缓冲区中预加载所有数据、顶点、着色器,或者更有效的方法,当一切就绪时,在一次调用中开始绘制它们,类似于批处理。谢谢

如果GPU有足够的内存用于所有着色器、缓冲区、纹理、FBO等,那么不要害怕使用数百(甚至数千)个绘制调用。如果没有,那就另当别论了,这取决于您想要更新到GPU RAM的内容。此外,将另一个上下文设置为当前上下文或对当前上下文进行一些更改并不便宜。