7

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

4

4 回答 4

5

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

pRawDevice->SetStreamSource( 0, m_VertexBuffer->GetBuffer(), m_VertexBuffer->GetOffset(), m_VertexBuffer->GetStride() );
于 2009-10-13T12:32:47.170 回答
2

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

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

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

如果所有对象都不同并且移动/动画,那么我会坚持使用单独的 VB。我怀疑将它们合并在一起你会注意到任何区别。

于 2009-10-13T14:24:49.690 回答
0

好吧,我的经验是,只要您的缓冲区不是非常小或非常大,它就不会产生太大的影响。我怀疑切换缓冲区的任何低效率都会与效率的提高相匹配,因为它为驱动程序提供了更多的操作性,以使用更小的缓冲区来管理它的内存。

于 2009-10-16T07:35:59.980 回答
-2

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

于 2009-10-13T12:18:37.807 回答