- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于在 OpenGL 程序中正确使用 VBO,我有点困惑。
我想创建一个地形分页算法,使用从 4096x4096 灰度高度图调用的 map 作为“整体” map 。
据我所知,存储在 VBO 中的每个顶点将占用 64 个字节。
我遇到的问题是,大多数来源都指出单个 VBO 的大小应在 1-4mb 之间,VBO 越少越好。然而根据我的计算,存储每个顶点总共需要大约 1 GB 的数据! (4096x4096x64)这不包括每个顶点可能需要为每个三角形存储多次。
一旦我完成了代码的地形部分,这也无法容纳这张 map 上的不同车辆和人员。
我看到的另一个解决方案是在程序运行时从硬盘驱动器中分页数据,但是另一个消息来源说在程序运行时创建和销毁是一个坏主意,而且最好的做法是尽可能少的 IBO。
我真正想知道的是,我错过了什么?我确信我在这里做了某种大规模的疏忽,因为 4mb 的最大 VBO 大小似乎非常小,即使我正在加载 64x64 block 中的纹理,以及也会填充 map 的不同交互对象。
或者我对自己能取得的成就的期望是不切实际的?有没有我不知道的更好的方法?我在看像 Oblivion 或 Fallout 3 这样的游戏,在某种程度上看 Boundless Planet,看到巨大的地形,想知道这到底是怎么可能的。
我了解如何编码,这不是我第一次深入研究 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.
不应该多次存储相同的顶点。使用索引图元(三角形列表或三角形带)。为索引绑定(bind)缓冲区,然后使用 glDrawElements和 glDrawRangeElements .请记住,您可以在 OpenGL 中使用四边形 - 您不必只使用三角形。
(4096x4096x64)
您不需要为 map 上的每个像素创建四边形。有些区域是完全平坦的(即高度不会改变),因此添加额外的三角形会浪费资源。如果将某种网格简化算法添加到完成的景观中,您应该能够删除相当多的三角形。此外,过多的多边形会导致问题 - 三角形或四边形应该占用多个像素。如果有多个基元应该占用同一个像素,渲染结果会有点“嘈杂”。因此,您必须考虑所需的详细程度。
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)
如果您以这种方式构建整个 map ,这是正确的。但是没有理由一次加载整个 map ,所以你只需要立即可见的 map block 。
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.
他们不会一次加载所有内容。任何时候都只加载可见的对象、当前地形“ block ”和附近少数地形 block 的低多边形版本。游戏仅存储当前使用或即将使用的对象。它不断地从 HDD 获取数据。
关于c++ - C++ 中的 OpenGl VBO 技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3218097/
目前,在我的渲染引擎中,每个网格数据都有一个 VBO(1 个 VBO 用于顶点,1 个 VBO 用于法线,1 个 VBO 用于纹理坐标,1 个 VBO 用于切线,1 个 VBO 用于副切线)并且它们都
我有一个代码,最初有一个着色器 (ourShader)、一个 VAO 和一个 VBO。它将使用 Stencil 测试渲染带有纹理立方体的场景及其在地面上的反射。现在,我想为后处理添加一个帧缓冲区,所以
因此,我使用两个 VBO 成功绘制了一系列线条,一个用于顶点,一个用于索引。 Python 列表是: vertices = [ [0,1],[0,2],[0,3], # Axe
因此,我需要使用一次绘制调用来渲染多个对象(而非实例)的方法。实际上我知道如何做到这一点,只是将数据放入单个 vbo/ibo 并使用 glDrawElements 进行渲染。 问题是:使用 glUni
大家好。我正在尝试呈现如下所示的两种方法。 RenderA() 使用的是 VBO 而 RenderB() 不是。当它到达 RenderB() 中的 glDrawArrays() 时,我收到一个 EXC
我正在尝试制作一个类似于《我的世界》的 opengl 体素引擎。 我创建了一个 block 类,我想将整个 block 的所有顶点放入单个 VBO 中。我之前只是将每个 block 放入 vbo 中并
我最近将当前项目中的绘图从内存阵列的标准绘图更改为 VBO。令我惊讶的是,帧速率从 60fps 显着下降到 30fps,绘制了 1200verts 的模型 8 次。进一步的分析表明,与从内存中绘制相比
所以我了解如何使用顶点缓冲区对象,并且它比立即模式绘图提供了很大的性能提升。我将绘制很多 2D 四边形( Sprite ),我想知道我是否应该为每个四边形创建一个 VBO,或者创建一个 VBO 来保存
我正在编写一个在 OpenGL 中渲染一些网格的插件。 我在一个 VBO 中有一个 Vertices 数组,在另一个 VBO 中有一个 Indices 数组。我现在想存储法线。由于多个面之间共享的顶点
你能渲染一个由四边形组成的 VBO,每个四边形都具有不同的纹理吗?现在,我读到了有关按纹理或纹理图集排序的内容,但这仍然不能回答我的问题。我正在开发一款 2d 游戏。现在我的动画 Sprite 将拥有
我有一个 2D VBO 对象,它表示 2D 空间中的点。此时绘制任意形状的最佳方法是什么?假设我想在每个位置画一个红色的“X”。 我可以使用着色器来做到这一点吗? 最佳答案 您不一定需要特殊的着色器,
如果我有一个顶点不断变化的模型,因此我需要在每一帧上重新绑定(bind) VBO 上的所有信息,使用即时模式是否会提高性能?或者,所有数据同时传递到 GFX 卡的事实仍然是 VBO 的救赎因素吗? 根
我想在交错的 OpenGL vbo 中存储三个浮点值和两个字节值。不幸的是,渲染的数据显然不正确。当我使用两个不同的 VBO 渲染相同的数据时,一切都工作正常,因此我不认为我的着色器存在问题。 /*
此代码工作正常,呈现正确(没有发布所有相关代码,因为我认为这些部分有问题): std::vector vboId; std::vector > verts; ...初始化: verts[num].pu
现在我正在使用索引,所以我在让我的 VBO 正确渲染法线时遇到了一些麻烦。我很确定我对普通指针的偏移有问题,但数学似乎加起来对我来说是正确的。 我如何存储数据: struct MyVertex {
我正在尝试使用 OpenGL 中的顶点缓冲区对象绘制两个四边形。他们应该用不同的颜色绘制。如您所见,第一个四边形具有红色、绿色、蓝色和黄色顶点。第二个四边形有不同的颜色,但问题是第二个四边形被完全绘制
我正在尝试在我的原生黑莓 10 应用程序中使用 VBO 绘制一个正方形。我的实现是, glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
在我的项目中,我想使用 vbo 显示许多对象(球体)。我设法毫无问题地显示 1 个对象,但是当涉及到 2 个或更多对象时,所有对象 (vbos) 都被最后定义的对象 (vbo) 替换。 CosmicB
我已经学习 VBO 几个星期了,有人告诉我 here VBO 可以渲染“约 100 万个顶点,每秒数百帧”。然而,我当前的 VBO 测试程序只能获得大约 50 FPS 的渲染速度和 100 万个顶点。
我正在使用 Haskell 制作一个渲染引擎,并且正在优化我的代码以使用 VBO。我想稍微抽象一下几何类型,因为有相当数量,并且想把它放在一个函数和一些参数中。 例如,如果我有一组几何体,它是一对顶点
我是一名优秀的程序员,十分优秀!