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

标签 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);
}

最佳答案

我第一眼看到的是您在每一帧上都创建了一个新 vector 。考虑缓存它。

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

关于c++ - OpenGL 实例渲染比 glBegin/glEnd 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42100677/

相关文章:

c++ - Centos 7安装HHVM报错"Internal compiler"

c++ - OpenGL通用图像读取器和GLFW(glfwReadImage、glfwLoadTexture2D)支持各种图像格式

opengl - GLSL 中的纹理与texture2D

opengl - GLSL double 角、三角函数和指数函数解决方法

c++ - 用于存储指针的线程安全循环缓冲区

c++ - sscanf 输入不工作

c++ - fmt::dynamic_format_arg_store 替换/实现 std::format

opengl - 网络上是否有任何示例如何使用着色器实现碰撞检测?

c - opengl中的平滑着色

glsl - 如何在 GLSL 结构体中初始化数组