加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

OpenGl VB中的VBO技术细节

发布时间:2020-12-17 00:02:02 所属栏目:大数据 来源:网络整理
导读:关于在OpenGL程序中正确使用VBO,我有点困惑. 我想创建一个地形分页算法,使用从4096×4096灰度高度图调用的地图作为“整体”地图. 根据我的阅读,存储在VBO中的每个顶点将占用64个字节. 我遇到的问题是,大多数消息来源都说单个VBO的大小应该在1-4mb之间,而VBO
关于在OpenGL程序中正确使用VBO,我有点困惑.

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

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

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

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

我看到的另一个解决方案是在程序运行时从硬盘驱动器中分页数据,但另一个消息来源说,在程序运行时创建和销毁是一个坏主意,并且最好的做法是尽可能少地使用VBO.可能.

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

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

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

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

From what I’ve read,each vertex stored in the VBO will take up 64 bytes.

它可能需要尽可能多的字节,具体取决于顶点格式.
position normal texcoords = 4 *(3 3 2)=每个顶点32个字节
position normal texcoords tangent vector(for bump)= 4 *(3 3 2 3)= 44 bytes

That’s not including that each vertice may need to be stored multiple times for each triangle.

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

(4096x4096x64)

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

The problem I have is that most sources state that a single VBO should be between 1-4mb in size,and less VBOs is better.

我不会相信每一个来源,特别是在互联网上.许多人编写教程远非“专家”.另一件事是在DirectX(不是OpenGL)中,建议尽可能将所有内容(即所有具有兼容顶点格式的对象)放入一个大的静态顶点缓冲区(VBO模拟),并避免切换缓冲区以减少渲染的CPU开销调用.因此,“VBO不应超过4 MB”的建议对我来说非常可疑.

只有来自API开发人员或驱动程序开发人员(ATI或NVidia)的信息才可信赖.或者当绝对肯定作者(教程或文章)在该领域有很多经验而不是另一个无知的想要游戏开发者.来自GDC,Siggraph,ATI,NVidia的文件可能是值得信赖的.应该检查由匿名者“某人”撰写的一些教程实际上是否正确.

无论如何,关于性能,微软有两个文件:
“Top Issues for Windows Titles”
“Performance Optimizations (Direct3D 9)”(DirectX的东西,但一些建议可适用于OpenGL).

此外,NVidia有一个OpenGL resources的集合,其中包括与性能相关的实用程序(GLexpert可能对您有用,还有NVIdia OpenGL SDK等).一般而言,当您尝试提高性能时,请尝试不同的技巧,并测量结果,而不是盲目地按照某人的建议.查看使用一种或另一种技术可获得的每秒额外帧数.

Yet according to my calculations,storing each vertex would take a total of about a gigabyte of data! (4096x4096x64)

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

I’m looking at games like Oblivion or Fallout 3,and to some extend Boundless Planet,and seeing massive terrains,and wondering how on earth that can be possible.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读