C++ 加速渲染多个模型-OpenGL
我想要一些在OpenGL中绘制许多对象的建议。我目前有一个模型类,它包含我所有的绘图数据和渲染调用 在我的程序中,我目前已将其设置为将多个模型推回std::vector,然后循环通过它们进行渲染,如下所示: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
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这几乎解决了我遇到的所有问题。谢谢你发现这个。