【问题标题】:OpenGL - Vertex Array inside a VBO and Index & Texture Array outside?OpenGL - VBO 内部的顶点数组和外部的索引和纹理数组?
【发布时间】:2011-10-17 03:54:50
【问题描述】:

是否可以将一组顶点放入 VBO,但采用索引和纹理坐标。来自常规内存的数组?如果是,使用哪种语法?

【问题讨论】:

    标签: opengl vbo


    【解决方案1】:

    是的,可以这样做。但你不应该。

    使用缓冲区对象的原因是为了提高性能。执行您的建议只会降低您通过正确使用缓冲区对象获得的性能。

    此外,这是大多数司机不经常看到的驱动程序路径。人们要么将缓冲区对象用于顶点数据,要么使用客户端内存数组。由于这条路人迹罕至,因此您更有可能遇到驱动程序错误。

    语法只是常规语法。 gl*Pointer 调用是否使用缓冲区对象取决于缓冲区对象是否绑定到 GL_ARRAY_BUFFER在进行 gl*Pointer 调用时。因此,您可以将缓冲区绑定到GL_ARRAY_BUFFER,使用偏移量进行gl*Pointer 调用,然后将0 绑定到GL_ARRAY_BUFFER 并使用实际指针进行gl*Pointer 调用。

    同样,如果缓冲区绑定到 GL_ELEMENT_ARRAY_BUFFER,则 glDraw*Elements* 调用使用缓冲区对象。因此,如果您想将客户端内存用于这些功能,请将 0 绑定到它。

    【讨论】:

    • 除了这个很好的答案:如果您的 texCoord 和索引缓冲区的数据经常更改,您始终可以设置 GL_DYNAMIC_DRAWGL_STREAM_DRAW 的用法。如果这是您希望它们从 CPU 内存中获取的原因。
    • 这确实是我的目标。但问题是 - 我不能在不损失性能的情况下每帧将那么多内存流式传输到缓冲区对象中。 (我必须在交换缓冲区之前重新流式传输数百次)。我的想法是将顶点放置到 GPU 内存中,因为它们永远不会更新并创建所有索引和纹理坐标集。在 RAM 中(因为它比 GPU 内存大得多)。这样我就不需要每帧复制任何内存——我只需根据需要在常规内存中选择正确的数组。
    • 如果我将所有数据都放在 CPU 中并且根本不使用 VBO,会不会更方便,性能可能更快?
    • @Fejwin:如果您要渲染如此多的顶点数据,以至于流式传输会为您中断,您为什么认为驱动程序(必须从您的客户端阵列中对其进行 DMA)将能够执行更好的工作?你是streaming correctly吗?此外,您应该自己测试一下,看看它是否能提供更好的性能。
    • @Fejwin:修改缓冲区对象的绑定是“免费的”(就修改是“免费的”而言)。绑定到使用一个不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2012-05-27
    • 2011-08-16
    • 2014-03-19
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多