我想要一些在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;
};
可以通过什么方式改进此代码以加快呈现多个(不同)模型的速度?