5

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

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

我在想,为纹理的侧面制作一个顶点而不包括偏移量的 VBO 是否最快,这样我就可以使用 glTranslate、glScale 和 glRotate 来移动我的纹理的绘图位置。然后我可以每次都使用相同的 VBO 来绘制纹理而不做任何更改。当我需要为圆角添加坐标时,我只能更改 VBO。

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

谢谢你的任何回答。

4

2 回答 2

4

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

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

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

于 2010-06-01T08:21:05.223 回答
1

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

于 2010-08-04T23:51:20.327 回答