OpenGL实例渲染比glBegin / glEnd慢

时间:2017-02-07 21:49:34

标签: c++ opengl glsl shader instance

我正在使用glBegin()/ glEnd()(顶部图片)将旧程序移植到glDrawArraysInstanced()(底部图片)。我期待一些性能改进,但我反其道而行之。现在这是我第一次尝试使用glDrawArraysInstanced(),所以我想我必须搞砸了。

两者基本相同,唯一的区别在于他们如何绘制圆圈。

我做错了什么?如果没有,是什么让它变慢?

enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:4)

我第一眼看到的是你在每一帧都创造了一个新的矢量。考虑缓存它。

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