改进OpenGL中的绘图对象(目前速度很慢)

时间:2017-12-03 09:33:59

标签: algorithm opengl

介绍

我有一个类似.obj格式的文件,长篇文章简称:

  • 我有一个填充了潜在顶点坐标的数组

  • 一个填充了三元组索引的数组(对应于坐标数组)

  • 索引定义了一个三角形,因此整个数组将定义形状

我的方法:

  • 为每个面创建一个包含9个浮点数的数组,包含每个顶点的坐标

  • 对于每张脸,我都会通过这个(简化的)代码:

    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, array_size, array, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    

问题在于,当我获得具有大量脸部的大文件时,它实际上很慢......例如,5000个脸部形状每帧花费约5秒。

我正在考虑将文件转换为大网格,然后绘制它,但我不知道如何解决这个问题,我也不知道这是否能解决我的问题?

2 个答案:

答案 0 :(得分:4)

问题似乎是你为每张脸分配一个缓冲区,你填充它然后你画它。每一帧。

由于形状的顶点是静态的,正确的方法是在加载游戏时分配缓冲区,填充它们,并且只在每帧执行绑定和绘制操作。

更好的是,你可以分配一个包含连接的所有顶点数据的大缓冲区,并使用索引绘图(看看glDrawElements),这将避免在每一帧执行绑定操作,再次执行只有一次。

答案 1 :(得分:4)

  

对于每张脸,我都会浏览这个(简化的)代码

这就是问题,与单个三角形的实际绘制时间相比,与GPU接口的开销很大。在一次调用中绘制整个网格。