代码之家  ›  专栏  ›  技术社区  ›  Electro SoapBox

一个顶点缓冲区中有多个网格?

  •  7
  • Electro SoapBox  · 技术社区  · 15 年前

    我需要为每个网格使用一个顶点缓冲区,还是可以在一个顶点缓冲区中存储多个网格?如果是这样,我应该做吗?我该怎么做?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Simon H.    15 年前

    可以在一个顶点缓冲区中存储多个网格。通过在一个缓冲区中放置几个小网格,可以获得一些性能。对于非常大的网格,应该使用单独的缓冲区。 SetStreamSource 用于指定当前网格的顶点缓冲偏移。

    pRawDevice->SetStreamSource( 0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride() );
    
        2
  •  2
  •   Goz    15 年前

    tbh通常将它们全部放在一个大缓冲区中的原因是为了节省draw调用。切换顶点缓冲区的成本相当低。如果您可以将它们全部合并到1个顶点缓冲区中,并在1次绘制调用中渲染10个对象,那么您将获得一个巨大的胜利。

    通常,为了合并它们,您只需创建一个大顶点缓冲区,其中包含所有顶点数据,这些数据已经在其中进行了一个接一个的转换。然后设置一个索引缓冲区,该缓冲区将一个接一个地呈现它们。然后在最小的绘图调用中绘制所有内容。当然,如果移动一个需要更新顶点缓冲区的一部分的对象,这就是为什么它是静态几何的理想情况。

    如果所有的对象都相同,那么您将只使用1个顶点缓冲区(其中包含1个对象定义)和1个索引缓冲区,对吗?矩阵移动或动画对象…

    如果所有的对象都是不同的,并且正在移动/设置动画,那么我就坚持使用单独的VBS。我怀疑你会注意到它们合并在一起有什么不同。

        3
  •  0
  •   jcoder    15 年前

    好吧,我的经验是,只要你的缓冲器不是很小或者很大,它就不会有太大的区别。我怀疑,任何切换缓冲区的效率低下都会与效率的提高相匹配,因为这会给驱动程序更多的操作性,以便用更小的缓冲区管理内存。

        4
  •  -2
  •   shoosh    15 年前

    使用OpenGL,您可以使用 glVertexPointer() 从VBO内的某个偏移开始绘制。对d3d不确定。