根据我的阅读,存储在 VBO 中的每个顶点将占用 64 个字节。
它可以占用任意数量的字节,具体取决于顶点格式。
position + normal + texcoords = 4*(3+3+2) = 32 bytes per vertex
position + normal + texcoords + 切线向量(凹凸)= 4*(3+3+2+3) = 44 bytes
这不包括每个顶点可能需要为每个三角形存储多次。
不应多次存储相同的顶点。使用索引图元(三角形列表或三角形条)。为索引绑定缓冲区,然后使用glDrawElements和glDrawRangeElements。请记住,您可以在 OpenGL 中使用四边形——您不必只使用三角形。
(4096x4096x64)
您不需要为地图上的每个像素创建四边形。有些区域是完全平坦的(即高度不变),因此添加额外的三角形会浪费资源。如果您在完成的景观中添加某种网格简化算法,您应该能够丢弃相当多的三角形。此外,过多的多边形会导致问题 - 三角形或四边形应该占用多个像素。如果有多个图元应该占用相同的像素,则渲染结果会有点“嘈杂”。因此,您必须考虑所需的详细程度。
我遇到的问题是大多数消息来源都指出单个 VBO 的大小应该在 1-4mb 之间,并且 VBO 越少越好。
我不会相信每个来源,尤其是在互联网上。很多写教程的人远非“专家”。另一件事是,在 DirectX(不是 OpenGL)中,建议尽可能将所有内容(即所有具有兼容顶点格式的对象)放入一个大型静态顶点缓冲区(VBO 模拟),并避免切换缓冲区以减少渲染的 CPU 开销来电。因此,“VBO 不应大于 4 MB”的建议对我来说非常可疑。
只有来自 API 开发人员或驱动程序开发人员(ATI 或 NVidia)的信息才可能值得信赖。或者当绝对确定(教程或文章的)作者在该领域拥有丰富的经验,而不是另一个毫无头绪的游戏开发者时。来自 GDC、Siggraph、ATI、NVidia 的文档可能是可信的。应该检查由匿名“某人”编写的一些教程是否实际上是正确的。
无论如何,关于性能,微软有两个文档:
“Windows 标题的热门问题”
“性能优化(Direct3D 9)”(DirectX 的东西,但一些建议可以适用于 OpenGL)。
此外,NVidia 拥有一系列OpenGL 资源,其中包括与性能相关的实用程序(GLexpert可能对您有用,还有 NVIdia OpenGL SDK 等)。通常,当您尝试提高性能时,请尝试不同的技术并衡量结果,而不是盲目地听从别人的建议。查看使用一种或另一种技术每秒获得多少额外帧。
然而根据我的计算,存储每个顶点总共需要大约 1 GB 的数据!(4096x4096x64)
如果您以这种方式构建整个地图,这是正确的。但是没有理由一次加载整个地图,因此您只需要立即可见的地图块。
我正在研究诸如 Oblivion 或 Fallout 3 之类的游戏,以及某种程度上的 Boundless Planet,看到了巨大的地形,并想知道这到底是怎么可能的。
他们不会一次加载所有内容。只有可见的对象、当前的地形“块”和少数附近地形块的低多边形版本在任何单个时刻被加载。游戏仅存储当前使用或即将使用的对象。它不断地从 HDD 获取数据。