0

我阅读了有关 DynamicVertexBuffer 的内容,以及它应该如何更好地处理经常变化的数据。我有一个由立方体组成的世界,我需要将立方体的顶点存储在这个缓冲区中以将它们绘制到屏幕上。

但是,并非所有立方体都有顶点(有些是空气,它是透明的),也不是立方体的所有面都需要绘制(它们彼此面对),所以我如何跟踪哪些顶点存储在缓冲?此外,某些面需要最后绘制,即其中具有透明度的面(如玻璃或树叶),并且这些面还需要以从后到前的顺序绘制,以免弄乱 alpha 混合。

如果所有这些顶点都任意存储在这个缓冲区中,我怎么知道哪些顶点在哪里?

此外,顶点的数量可以改变,但 DynamicVertexBuffer 对我来说似乎不是很动态,因为我根本无法改变它的大小。每次我需要添加或删除面时,我是否必须重新创建缓冲区?

4

1 回答 1

4

听起来你以错误的方式处理这个问题 - 假设你的世界中只有微不足道的立方体。您应该将世界(和它的立方体)存储在自定义数据结构中,这样您就可以在向给定方向查看时,根据您的世界规则从给定点快速确定哪些立方体(和面)是可见的。

然后,每次渲染场景时,都会生成一批只包含这些面的顶点缓冲区。所以不要使用顶点缓冲区作为存储世界整个几何图形的基础。顶点缓冲区是一种渲染工具,而不是世界场景图工具。

这些大规模可见性问题在代码中的运行速度比在 GPU 中运行得快得多。例如,如果你坐在原点,看+x,你可以立即忽略-ve x 方向的所有立方体,这是一个非常简单的例子。

有关八叉树渲染的更完整示例搜索。这种渲染将非常适合您的世界布局。

最后的提示 - 当我说生成批次的顶点缓冲区时 - 我的意思是将你的立方体以最小化 GPU 状态变化的方式(例如相同的纹理,相同的着色器等)。最小化对 GPU 状态的更改是优化渲染的关键——一旦你已经尽可能地从渲染中剔除面。

于 2011-01-15T23:10:10.617 回答