【问题标题】:How do work with varying number of vertices in OpenGL gl3?如何在 OpenGL gl3 中处理不同数量的顶点?
【发布时间】:2016-04-30 15:13:30
【问题描述】:

我正在自学 JOGL。我刚刚从GL2切换到GL3。我发现关于GL3的教程很少。另外,我发现GL3与GL2完全不同。据我所知,许多人使用缓冲区来保存所有顶点并将它们绑定到 OpenGL。但是,当他们初始化缓冲区时,他们使用了长度固定的数组。如果顶点的数量从一开始就固定,我将如何处理不同数量的顶点或对象?有没有简单的例子?一般来说,我怎样才能让我的程序更“动态”? (即渲染用户定义的 3D 世界)

【问题讨论】:

  • 这取决于您的对象的平均大小和寿命
  • 那么,还有更具体的例子吗?比方说,如果我要制作一个迷你 Blender(3D 建模程序),让用户生成和修改少量对象?我应该采取什么方法?或者,如果我必须处理大量对象?(也许是一个迷你的我的世界)我应该采取什么方法?
  • 如果我们谈论由用户修改的东西,这在计算机术语中意味着很长的寿命,您应该只销毁旧缓冲区并在顶点数量发生变化时创建新缓冲区。迷你Minecraft世界的方法相同。给你一些数字,我工作的一个 cad 程序,总共有超过 4k 个对象和超过 2700 万个三角形,大约需要 1 秒来传输 gpu(中等性能 pc, gtx 770)
  • 你可能想关注this tutorial
  • 确实很快。那么,如果生命周期很短(可能是游戏或动画或模拟器?),您是否希望我先创建一个巨大的缓冲区并及时修改缓冲区?另外,你刚才提到销毁和创建,我关心垃圾收集过程?我应该不断调用它以确保垃圾不会堆积吗?(我知道java会不时调用它,但有时我发现它很慢)

标签: java opengl opengl-3


【解决方案1】:

我能想到的最好的方法是在初始化阶段创建一个大缓冲区并使用glBufferSubData() 修改数据。另一种方法是使用glBufferData() 重新创建缓冲区,尽管这种方法并不可取,因为每次创建新实体/对象到世界/从世界中删除时重新创建缓冲区的成本很高(可能偶尔会很好)。

【讨论】:

  • 感谢您的建议。似乎GL3/GL4牺牲了GL2的灵活性来获得速度。当然,重新创建缓冲区会花费大量计算,我认为这不是一个好主意(但仍然可行)。
  • @FunnyFunkyBuggy 好吧,您当然可以将这些实体存储在 ArrayList 中,您可以根据需要添加或删除实体,并使用相同的缓冲区(简单的四边形缓冲区)逐个渲染它们.但是这种方法也会影响您的性能,因为在没有批处理的情况下调用许多绘图调用也很糟糕。
  • @FunnyFunkyBuggy 我知道这已经很晚了,哈哈。但经过进一步的研究,我跑到this 可能会回答。如果您已经弄清楚了,请忽略此评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多