对于在 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/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只