加速渲染多个模型-OpenGL

时间:2019-07-15 10:29:43

标签: c++ opengl

我想要一些在OpenGL中绘制许多对象的建议。我目前有一个Model类,其中包含我所有用于绘制的数据以及render调用。

我目前在程序中将其设置为将多个模型push_back推入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);
}

但是渲染时,性能很差,一旦达到简单的基本体(立方体)的大约300个模型(仅约3500个三角形),程序就开始滞后。

由于我的所有模型在最终产品中都会有所不同,因此我不想使用实例化,它们现在完全相同,用于调试目的。

我的render_data格式为:

{
    pos1x, pos1y, pos1z, norm1x, norm1y, norm1z,
    pos2x, ...
    ...
}

我的抽奖电话如下:

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;
};

可以通过什么方式改进此代码以加快呈现多个(不同)模型的速度?

0 个答案:

没有答案