C++ 加速渲染多个模型-OpenGL

C++ 加速渲染多个模型-OpenGL,c++,opengl,C++,Opengl,我想要一些在OpenGL中绘制许多对象的建议。我目前有一个模型类,它包含我所有的绘图数据和渲染调用 在我的程序中,我目前已将其设置为将多个模型推回std::vector,然后循环通过它们进行渲染,如下所示: std::vector<Model> all_models; ... for(auto &single_model : all_models){ the_shader.setMat4("model", single_model.model); single

我想要一些在OpenGL中绘制许多对象的建议。我目前有一个模型类,它包含我所有的绘图数据和渲染调用

在我的程序中,我目前已将其设置为将多个模型推回std::vector,然后循环通过它们进行渲染,如下所示:

std::vector<Model> all_models;
...
for(auto &single_model : all_models){
    the_shader.setMat4("model", single_model.model);
    single_model.draw(the_shader);
}
void Model::draw(Shader shader)
{
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, render_data.size() * sizeof(float), render_data.data(), GL_STATIC_DRAW);

    // pos
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

    // norm
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, (unsigned int)render_data.size());
}
我的抽签通知如下:

std::vector<Model> all_models;
...
for(auto &single_model : all_models){
    the_shader.setMat4("model", single_model.model);
    single_model.draw(the_shader);
}
void Model::draw(Shader shader)
{
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, render_data.size() * sizeof(float), render_data.data(), GL_STATIC_DRAW);

    // pos
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

    // norm
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, (unsigned int)render_data.size());
}
我还在下面添加了我的模型类,作为一个完整的示例

class Model
{
public:
    Model(std::string inFilePath);
    ~Model();

    void draw(Shader shader);

    std::vector<unsigned int> vertIndices;
    std::vector<unsigned int> normIndices;

    std::vector<glm::vec3> vertices;
    std::vector<glm::vec3> normals;

    std::vector<float> render_data;

    // Model matrix
    glm::mat4 model = glm::mat4(1.0f);

    unsigned int VAO, VBO;
};
类模型
{
公众:
模型(标准:字符串填充路径);
~Model();
虚空绘制(着色器);
std::矢量垂直;
std::向量指数;
向量顶点;
std::向量法线;
std::矢量渲染数据;
//模型矩阵
glm::mat4模型=glm::mat4(1.0f);
无符号整数VAO,VBO;
};

有哪些方法可以改进此代码以加快多个(不同)模型的渲染速度?

在每个帧中生成新的VBO/VAO(并且从不删除它们)。不要那样做。在初始化过程中创建一次,只上载一次数据,然后在每个帧中绘制它们。只有draw方法的最后两行应该保留在这个方法中。@BDL这几乎解决了我遇到的所有问题。感谢您发现这一点。您可以在每一帧中生成新的VBO/VAO(并且从不删除它们)。不要那样做。在初始化过程中创建一次,只上载一次数据,然后在每个帧中绘制它们。只有draw方法的最后两行应该保留在这个方法中。@BDL这几乎解决了我遇到的所有问题。谢谢你发现这个。