java - 需要一些帮助来使用 Frustum Culling 实现 VBO

标签 java opengl vbo lwjgl frustum

我目前正在为一个学校项目开发我的第一个 3D 游戏,游戏世界完全受到我的世界的启发(世界完全由立方体组成)。我目前正在寻求提高尝试实现顶点缓冲区对象的性能,但我被卡住了,我已经实现了这些方法:Frustum culling, only drawing exposed faces and distance culling 但我有以下疑问:

  1. 目前我的世界中有大约 2^24 个立方体,分成 1024 个 16*16*64 立方体 block ,现在我正在做即时模式渲染,如果我实现的话,它与截锥体剔除配合得很好每个 block 一个 VBO,我每次移动相机时都必须更新那个 VBO(以更新截锥体)吗?这会影响性能吗?

  2. 我可以动态更改每个 VBO 的大小吗?还是我必须让每一个都尽可能大(完全充满对象的 block )?

  3. 我是否必须将每个访问过的 block 保存在内存中,或者我是否可以有效地删除该 VBO 并在需要时重新创建它。

最佳答案

  1. 每次更改相机视锥体时都更改 VBO 可能不是一个好主意。连续缓冲数据所带来的开销可能会超过绘制更少的多边形所带来的任何性能提升。当它们完全移出平截头体时,您最好剔除整个 IBO。您最终会绘制出比绝对必要的更多的多边形,但从 VBO 绘制比在即时模式下绘制快得多这一事实足以抵消这一点。
  2. 您可以更改 VBO 的大小,但只能通过对 glBufferData 进行新调用,如果您要将数据发送到图形卡,这可能是一个昂贵的调用。
  3. 您最好不要将您为其创建的 VBO 的所有 block 都保存在内存中,那样很快就会失控。将周围环境牢记在心,并在离开时丢弃它们是最好的选择。

关于java - 需要一些帮助来使用 Frustum Culling 实现 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315908/

相关文章:

java - 我该如何解决这个问题我一直得到零作为我的答案而不是我的条件

java - 设计模式 - 使用通用对象来更新 GUI

c++ - 如何修复 OpenGL 3.3 中的黑屏输出

java - 为什么我的模型没有在 LWJGL 中使用着色器和 VBO 渲染任何内容

java - Android OpenGL ES 2.0 VBO

java - 为什么在传递 Function 类型参数而不是 Consumer 时,java 中的 for-each 方法不抛出异常?

java - 通过 Hibernate 聚合将实体映射到 pojo

OpenGL FrameBuffer 上下颠倒和右下角

qt - OpenGL 或 OpenGL ES

android - 尝试在 API 8 (2.2) 的 OPENGL 2 中实现 VBO