【问题标题】:OpenGL fast texture drawing with vertex buffer objects. Is this the way to do it?使用顶点缓冲对象的 OpenGL 快速纹理绘制。这是这样做的方法吗?
【发布时间】:2010-05-31 15:51:09
【问题描述】:

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

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

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

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

感谢您的任何回答。

【问题讨论】:

    标签: c++ opengl graphics textures vbo


    【解决方案1】:

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

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

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多