使用顶点缓冲对象的OpenGL快速纹理绘制。这是这样做的吗?

时间:2010-05-31 15:51:10

标签: c++ opengl graphics textures vbo

我正在用OpenGL制作2D游戏。我想通过使用VBO来加速我的纹理绘制。

目前我正在使用立即模式。当我旋转和缩放纹理时,我正在生成自己的坐标。我还具有圆角纹理的功能,使用多边形基元来绘制它们。

我在想,用包含没有偏移的纹理边的顶点制作VBO会是最快的,所以我可以使用glTranslate,glScale和glRotate来移动纹理的绘制位置。然后,我可以使用相同的VBO,无需更改,每次都可以绘制纹理。我只能在需要为圆角添加坐标时更改VBO。

这是最好的方法吗?这样做时我应该注意什么?在现代图形卡中使用GL_TRIANGLES而不是GL_QUADS真的最快吗?

感谢您的回答。

2 个答案:

答案 0 :(得分:4)

为了获得更好的性能,您不应该使用立即模式渲染,而是使用顶点缓冲区(在CPU或GPU上)并使用glDrawArrays等绘制方法。通过修改纹理矩阵乘数来缩放/旋转纹理坐标不是性能问题,您只需为整个网格设置一些小值。这里最重要的瓶颈是将每顶点数据(例如颜色,位置和纹理坐标)传输到GPU,这就是GPU上的顶点缓冲区对象可以提供很大帮助。

如果要绘制到屏幕的网格是静态的,也就是说,您将其设置一次而不需要稍后修改(部分),则可以为整个网格生成纹理坐标,包括所有角点) 只有一次。您可以稍后使用纹理矩阵乘数修改整个网格的纹理坐标。但是,如果要使用不同的变换修改网格的不同部分,则必须将网格划分为多个部分。根据您的描述,我了解您想绘制一个圆角矩形,其中包含一张图片,可以使用单个静态网格物体(每顶点数据列表)来完成。

最后,GL_QUADS在现代OpenGL规范中也被弃用。它们无论如何都不提供太多功能,因此您应该将QUADS切换为三角形或三角形条/扇形。

答案 1 :(得分:1)

如果要使用VBO绘制纹理多边形,则需要不仅为顶点创建缓冲区,还需要为纹理坐标(每个顶点一个UV坐标)创建缓冲区,如果要进行顶点照明,则需要为顶点颜色创建缓冲区(如果没有,请使用glColor)。在绑定目标纹理之前使用glClientActiveTexture(GL_TEXTUREn)。在发出渲染调用之前,不要忘记对每个缓冲区类型使用glEnableClientState()。