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

Algorithm 改进OpenGL中的绘图对象(目前速度非常慢),algorithm,opengl,Algorithm,Opengl,简介: 我有一个类似.obj格式的文件,长话短说意味着: 我有一个数组,里面充满了潜在顶点的坐标 一个包含三个索引的数组(对应于坐标数组) 索引定义了一个三角形,因此整个数组将定义形状 我的方法: 为每个面创建9个浮动的数组,其中包含每个顶点的坐标 对于每个面,我都会运行以下(简化)代码: 问题是,当我接触到有很多面孔的大文件时,速度非常慢。。。例如,5000张脸的形状每帧大约需要5秒 我正在考虑将文件转换为一个大网格,然后绘制它,但我不知道如何解决这样的问题,我也不知道这是否能解决我

简介:

我有一个类似.obj格式的文件,长话短说意味着:

  • 我有一个数组,里面充满了潜在顶点的坐标

  • 一个包含三个索引的数组(对应于坐标数组)

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

我的方法:

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

  • 对于每个面,我都会运行以下(简化)代码:

问题是,当我接触到有很多面孔的大文件时,速度非常慢。。。例如,5000张脸的形状每帧大约需要5秒


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

问题似乎是,您为每个面分配一个缓冲区,填充它,然后绘制它。每一帧

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

更妙的是,您可以分配一个包含所有连接顶点数据的大缓冲区,并使用索引绘图(查看
gldrawerelements
),这样可以避免在每个帧上执行绑定操作,而只执行一次

对于每一张脸,我都会运行这个(简化的)代码

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

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