使用顶点缓冲对象实现快速OpenGL纹理绘制。这是正确的方法吗?

5
我正在使用OpenGL制作2D游戏。我想通过使用VBO来加速纹理绘制。
目前,我正在使用直接模式。当我旋转和缩放纹理时,我会生成自己的坐标。我还具有使用多边形基元绘制圆角纹理的功能。
我在想,是否最快的方法是使用没有偏移量的纹理边缘顶点创建一个VBO,以便我可以使用glTranslate、glScale和glRotate来移动纹理的绘制位置。然后,我可以使用相同的VBO来每次绘制纹理而无需更改它。只有当我需要添加圆角的坐标时,才能更改VBO。
这是最好的方法吗?在执行此操作时应该注意什么?在现代图形卡中,GL_TRIANGLES比GL_QUADS更快吗?
感谢您的回答。
2个回答

4
为了获得更好的性能,您不应该使用即时模式渲染,而是应该使用顶点缓冲(在CPU或GPU上),并使用glDrawArrays等方法进行绘制。通过修改纹理矩阵乘数来缩放/旋转纹理坐标不会影响性能,您只需为整个网格设置一些小值。这里最重要的瓶颈是将每个顶点数据(如颜色、位置和纹理坐标)传输到GPU,这就是GPU上顶点缓冲对象可以极大帮助解决的问题。
如果您要绘制到屏幕上的网格是静态的,也就是说,您只需要一次设置它,以后就不需要再修改它(部分内容),则可以仅针对整个网格(包括所有角落)生成纹理坐标一次。稍后,您可以使用纹理矩阵乘数修改整个网格的纹理坐标。但是,如果您想使用不同的变换修改网格的不同部分,您将需要将网格划分为几个部分。根据您所描述的,我理解您想要绘制一个圆角矩形,里面装有图片,可以使用一个静态网格(每个顶点数据列表)来完成。
最后,GL_QUADS在现代OpenGL规范中也已经不推荐使用。它们也没有提供太多功能,因此您应该将QUADS切换为三角形或三角形条带/扇形。

谢谢。我已经成功地让VBOS在某些行代码中工作,但无法用于纹理绘制。我不知道该怎么做。我尝试的一切都失败了。我想我需要另一个问题。 - Matthew Mitchell
你是否看到了你想要的对象?是不是只有模型纹理不正确?如果你看到了你的对象在正确的位置,记住纹理坐标值就像顶点位置值一样。从简单的开始(不要在纹理矩阵模式下使用glTranslate等修改纹理坐标),然后尝试扩展它以实现最终想要看到的效果。 - AdilYalcin
目前它正在正确的位置进行渲染,只是渲染效果不佳。无论是GL_QUADS还是GL_TRIANGLES都失败了。我会用我的VBO代码提出一个新问题。将颜色信息添加到VBO中是否很重要?“glColor”会成为一个大问题吗?感谢您的答复和帮助。 - Matthew Mitchell
不能在基于顶点缓冲区的绘制命令(例如glDrawElements和glDrawArrays)中混合使用glColor和类似的命令。您应该使用glColorPointer、glVertexPointer和相关方法来设置预定义的顶点语义。如果您的纹理坐标正确,并且仍然无法观察到任何纹理,则请检查是否启用了纹理,同时光照也可能会影响结果。一旦您可以清楚地看到纹理平铺在网格上,修改将更容易进行。 - AdilYalcin
四边形已经被弃用,因为四个顶点可能不在同一平面上,而三个顶点(三角形)总是定义一个平面。 - Luca

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接