首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要一些帮助才能实现VBO与Frustum剔除

需要一些帮助才能实现VBO与Frustum剔除
EN

Stack Overflow用户
提问于 2011-11-29 18:36:48
回答 2查看 623关注 0票数 4

我目前正在为一个学校项目开发我的第一个3D游戏,游戏世界完全受“我的世界”(完全由立方体构成的世界)的启发。我目前正在努力提高实现顶点缓冲区对象的性能,但我被困住了,我已经实现了以下方法: Frustum,只绘制暴露的面孔和距离剔除,但我有以下疑问:

  1. 我目前在我的世界中大约有2^24个立方体,分成1024块16×16*64立方体,现在我正在进行即时模式渲染,这很适用于水果筛选,如果我每块实现一个VBO,我是否必须在每次移动相机时更新那个VBO (更新果体)?这会影响性能吗?
  2. 我能动态地改变每个VBO的大小吗?还是我必须使每个块尽可能大(这个块完全填充了objects)?.
  3. Would,我必须将每个访问的块保存在内存中,或者我是否可以有效地删除VBO,并在需要时重新创建它。)
EN

回答 2

Stack Overflow用户

发布于 2011-11-29 18:52:41

  1. 在每次你改变相机时改变VBO不太可能是个好主意。持续缓冲数据的开销可能会超过绘制较少多边形所获得的任何性能收益。当整个VBO完全走出挫折时,你可能会更好地选择它们。最终,您将画出比严格需要的更多的策略,但从VBO中提取要比在立即模式下绘制要快得多,这将更加平衡。
  2. 您可以更改VBO的大小,但只有通过对glBufferData进行新的调用,如果将数据发送到显卡,这可能是一个昂贵的调用。
  3. 最好不要将创建VBO的所有块保存在内存中,这样很快就会失去控制。将你的周围环境留在记忆中,并在你离开时抛弃它们是你最好的选择。--
票数 2
EN

Stack Overflow用户

发布于 2011-11-29 18:55:53

  1. ,第一种天真(在不好的意义上不一定必要)的方法,实际上是基于结果和隐藏的人脸剔除结果来更新VBO的每一个帧。虽然这听起来可能很邪恶,但请记住,使用即时模式实际上是一样的(向GPU发送每个帧的每个顶点),但是有一百万个驱动程序调用(不要低估一个glVertex),而不仅仅是几个缓冲区函数和一个抽签调用。

因此,使用VBO(当然是使用GL_DYNAMIC_DRAW甚至GL_STREAM_DRAW )可能仍然比直接模式更快。它不仅可能的GPU存储,而且减少了驱动程序调用的数量,使VBO(或顶点数组一般)比即时模式更快。

稍后,您还可以使用转换反馈实现一些更复杂的硬件剔除技术,因此您可以直接在GPU上进行剔除,并且不需要将顶点数据发送到每个帧。

  • 因为您更新了每个帧的整个缓冲区(因此应该调用glBufferData),因此调整大小是绝对没有问题的。只需用不同的大小再次调用glBufferData

  • ,这取决于您有多少块。但是,如果它们的数量越来越大,一些缓存技术(删除更远的VBOs、选择的距离、块)可能是个好主意。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8315908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档