我目前正在为学校项目开发我的第一款3D游戏,游戏世界完全受到我的世界(完全由立方体制成的世界)的启发。我目前正在寻求提高实现顶点缓冲区对象的性能,但我已经陷入困境,我已经实现了这些方法:挫败剔除,只绘制暴露面和距离剔除但我有以下疑问:< / p>
我目前在我的世界中有大约2 ^ 24个立方体,分为1024个16 * 16 * 64立方体块,现在我正在进行立即模式渲染,这对于截锥体剔除效果很好,如果我每个块实现一个VBO,每次移动相机时我是否必须更新VBO(更新截头锥体)?这会有性能影响吗?
我可以动态更改每个VBO的大小吗?或者我是否必须使每一个都成为可能的最大尺寸(完全充满物体的块)?。
我是否必须将每个访问过的块保留在内存中,或者我是否可以有效地删除该VBO并在需要时重新创建它。
答案 0 :(得分:1)
glBufferData
进行新的调用,如果您将数据发送到图形卡,这可能是一项昂贵的调用。答案 1 :(得分:1)
第一个天真(不一定是坏意义)的方法确实是基于截头锥体和隐藏面部剔除结果来更新每帧的VBO。虽然这可能听起来很邪恶,但请记住,使用立即模式实际上是相同的(每帧将每个顶点发送到GPU)但是有一百万个驱动程序调用(不要低估glVertex
)而不是仅仅几个缓冲函数和一个绘制调用。
因此,使用VBO(当然使用GL_DYNAMIC_DRAW
甚至GL_STREAM_DRAW
)很可能仍然比立即模式更快。它不仅可能是GPU存储,而且还减少了使VBO(或一般顶点阵列)比立即模式更快的驱动程序调用次数。
稍后您还可以使用变换反馈实现一些更复杂的硬件剔除技术,因此您可以直接在GPU上进行剔除,而无需每帧将顶点数据发送到GPU。
因为无论如何都要更新每个帧的整个缓冲区(因此应该调用glBufferData
),调整大小绝对没问题。只需使用其他尺寸再次致电glBufferData
。
这取决于你有多少块。但是如果它们的数量变大,一些缓存技术(删除更远的VBO,距离剔除,块)可能是一个好主意。