Рисование много треугольников путем вызова glDrawElements () становится медленным? - PullRequest
0 голосов
/ 28 ноября 2018
for (int i = 0; i < 100000000; ++i)
{
    model = glm::translate(glm::mat4(1.0), glm::vec3(i * 2, i * 2 , i * 2));
    glUniformMatrix4fv(modellocation, 1, GL_FALSE, &model[0][0]);

    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (void *)0);
}

вот часть моего кода.

Я хочу нарисовать 100000000 треугольников, но это становится очень медленным.Я знаю, это потому, что я звонил glDrawElements так много раз.И я также знаю, что мне нужно рисовать больше треугольников за один раз, чтобы не вызывать glDrawElements слишком много раз.

Но я не понимаю, как это сделать, нужно ли мне менять буфер, который у меня есть, или я могу использовать другой способ сделать это?

вот мой буфер

float vertex[] = {
    0.0f, 0.5f, 0.0f,
    -0.5f, 0.0f, 0.0f,
    0.5f, 0.0f, 0.0f,
};

И мой индексный буфер

unsigned int indices[] = {     0, 1, 2    };

И я привязываю буфер вот так

unsigned int VBO, VAO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

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

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете поместить более одного треугольника в буфер вершин и «нарисовать» их все сразу.Вот пример сферы, состоящей из множества треугольников: SolarSystem
Вы можете взять мой проект из GitHub и просмотреть его, это может помочь.

Также есть другой метод, которыйможет значительно ускорить процесс, например.Он не используется в проекте SolarSystem, но я использовал его в проекте Event Driven Molecular Dynamics.

...