OpenGl VBO C++技术

Bri*_*ian 5 c++ opengl graphics vbo terrain

关于在OpenGL程序中正确使用VBO,我有点困惑.

我想创建一个地形分页算法,使用地图从4096x4096像素的灰度高度图作为"整体"地图调用.

根据我的阅读,存储在VBO中的每个顶点将占用64个字节.

我的问题是,大多数消息来源称,一个VBO应该在大小是1-4mb之间,少维也纳组织为好.然而根据我的计算,存储每个顶点总共需要大约一千兆字节的数据!(4096x4096x64)这是不包括每个顶点可能需要多次存储每个三角形.

一旦我得到代码的地形部分,这也不适应不同的车辆和人员.

我看了看其他的解决办法是从硬盘驱动器数据的程序运行时的页面,但另一个来源说,这是一个坏主意,创建和销毁,而程序的运行,而且它也是最好的做法有少维也纳组织作为可能.

我真正想知道的是,我错过了什么?我确定我在这里做了一些大规模的疏忽,因为即使我在64x64块中加载纹理,以及填充地图的不同交互式对象,最大VBO大小4mb似乎也非常低.

或者我对我能取得的成就的期望是不现实的?有没有更好的方法可供我使用,我不知道?我正在寻找像Oblivion或Fallout 3这样的游戏,以及一些无边界星球,看到大量的地形,并想知道地球上的可能性.

我理解如何编码,这不是我第一次深入研究OpenGL,但这是我第一次尝试理解和利用VBO.

如果有人能够了解我对VBO的理解是错误的,那将非常感激.

Sig*_*erm 9

根据我的阅读,存储在VBO中的每个顶点将占用64个字节.

它可能需要尽可能多的字节,具体取决于顶点格式.
position + normal + texcoords = 4*(3 + 3 + 2)=每个顶点
位置32个字节+法线+ texcoords +切线向量(用于凹凸)= 4*(3 + 3 + 2 + 3)= 44个字节

这并不包括每个三角形可能需要多次存储每个顶点.

不应多次存储相同的顶点.使用索引基元(三角形列表或三角形条).绑定指标的缓冲区,然后使用glDrawElementsglDrawRangeElements.请记住,您可以在OpenGL中使用四边形 - 您不必仅使用三角形.

(4096x4096x64)

您无需为地图上的每个像素创建四边形.有些区域是完全平坦的(即高度不会改变),因此添加额外的三角形将浪费资源.如果你为完成的景观添加某种网格简化算法,你应该能够丢弃相当多的三角形.此外,太多的多边形会导致问题 - 三角形或四边形应该占用几个像素.如果存在多个应该占据相同像素的基元,则渲染结果将有点"嘈杂".因此,您必须考虑所需的详细程度.

我的问题是,大多数消息来源称,一个VBO应该在大小是1-4mb之间,少维也纳组织为好.

我不会相信每一个来源,特别是在互联网上.许多人编写教程远非"专家".另一件事是在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等).一般而言,当您尝试提高性能时,请尝试不同的技巧,并测量结果,而不是盲目地按照某人的建议.查看使用一种或另一种技术可获得的每秒额外帧数.

然而根据我的计算,存储每个顶点总共需要大约一千兆字节的数据!(4096x4096x64)

如果您以这种方式构建整个地图,这是正确的.但是没有理由一次加载整个地图,所以你只需要立即可见的地图块.

我正在寻找像Oblivion或Fallout 3这样的游戏,以及一些无边界星球,看到大量的地形,并想知道地球上的可能性.

他们不要一次装载所有东西.只有可见的对象,地形的当前"块"和几个附近地形块的低多边形版本才会在任何单个时刻加载.游戏只存储当前使用的对象,或者即将使用的对象.它不断从HDD获取数据.