我正在将使用glBegin()/ glEnd()(上图)的旧程序移植到glDrawArraysInstanced()(下图)。我期望性能有所提高,但是却相反。现在,这是我第一次尝试使用glDrawArraysInstanced(),所以我认为我肯定已经搞砸了。

两者基本上是相同的,唯一的区别是它们绘制圆圈的方式。

我做错了什么?如果不是,什么使它变慢?

c++ - OpenGL实例渲染比glBegin/glEnd慢-LMLPHP
c++ - OpenGL实例渲染比glBegin/glEnd慢-LMLPHP

// This runs once at startup
std::vector<glm::mat4> transforms;
glGenBuffers(NUM_BUFFERS, VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO[TRANSFORM]);
for (int i = 0; i < 4; ++i) {
  glEnableVertexAttribArray(1 + i);
  glVertexAttribPointer(1 + i, 4, GL_FLOAT, GL_FALSE, sizeof(glm::mat4),
                      (GLvoid *)(i * sizeof(glm::vec4)));
  glVertexAttribDivisor(1 + i, 1);
} // ---------


// This runs every frame
if (num_circles > transforms.size()) transforms.resize(num_circles);
int i = 0;
for (const auto &circle : circle_vec) {
  transforms[i++] = circle.transform.getModel();
}

glBindBuffer(GL_ARRAY_BUFFER, VBO[TRANSFORM]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * num_circles,    &transforms[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArray(VAO);
glDrawArraysInstanced(GL_LINE_LOOP, 0, CIRCLE_NUM_VERTICES, num_circles);
glBindVertexArray(0);
// ---------


// And this is the vertex shader
#version 410

in vec3 position;
in mat4 transform;

void main()
{
   gl_Position = transform * vec4(position, 1.0);
}

最佳答案

我第一眼看到的是您正在每个帧上创建一个新 vector 。考虑将其缓存。

// This runs every frame
std::vector<glm::mat4> transforms;

10-08 01:02