我是否需要为每个网格使用一个顶点缓冲区,还是可以在一个顶点缓冲区中存储多个网格?如果是的话,我应该这样做,我该怎么做?
答案 0 :(得分:5)
您可以在一个顶点缓冲区中存储多个网格。您可以通过在一个缓冲区中放入几个小网格来获得一些性能。对于非常大的网格,您应该使用单独的缓冲区。 SetStreamSource
允许您为当前网格指定顶点缓冲区偏移量。
pRawDevice->SetStreamSource( 0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride() );
答案 1 :(得分:2)
TBH一般将它们放在一个大缓冲区中的原因是为了节省绘制调用。切换顶点缓冲区的成本相当低。如果你可以将它们全部合并到1个顶点缓冲区并在1个绘制调用中渲染10个对象,那么你将获得巨大的胜利。
通常要合并它们,您只需创建一个大的顶点缓冲区,其中包含所有已经在其中进行了世界变换的顶点数据。然后,您设置一个索引缓冲区,一个接一个地呈现它们。然后你可以用最少的绘制调用绘制所有内容。当然,如果你移动一件需要更新顶点缓冲区的部分,这就是为什么它是静态几何的理想情况。
如果所有对象都相同,那么你只会使用1个顶点缓冲区(其中包含1个对象定义)和1个索引缓冲区吗?矩阵移动或动画对象...
如果所有对象都不同并且移动/动画,那么我只会坚持使用单独的VB。我怀疑你通过将它们合并在一起会发现任何差异。
答案 2 :(得分:0)
我的经验是,只要您的缓冲区不是很小或非常大,它就没有那么大的差别。我怀疑切换缓冲区的任何低效都会与效率的提高相匹配,为驱动程序提供更多的操作来管理它的内存和更小的缓冲区。
答案 3 :(得分:-2)
使用OpenGL,您可以使用glVertexPointer()
从VBO中的某个偏移量开始绘制。不确定D3D。