介绍
我有一个类似.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秒。
我正在考虑将文件转换为大网格,然后绘制它,但我不知道如何解决这个问题,我也不知道这是否能解决我的问题?
答案 0 :(得分:4)
问题似乎是你为每张脸分配一个缓冲区,你填充它然后你画它。每一帧。
由于形状的顶点是静态的,正确的方法是在加载游戏时分配缓冲区,填充它们,并且只在每帧执行绑定和绘制操作。
更好的是,你可以分配一个包含连接的所有顶点数据的大缓冲区,并使用索引绘图(看看glDrawElements
),这将避免在每一帧执行绑定操作,再次执行只有一次。
答案 1 :(得分:4)
对于每张脸,我都会浏览这个(简化的)代码
这就是问题,与单个三角形的实际绘制时间相比,与GPU接口的开销很大。在一次调用中绘制整个网格。