【问题标题】:Java OpenGL rendering many trianglesJava OpenGL 渲染许多三角形
【发布时间】:2010-11-29 18:39:06
【问题描述】:

我有一个 openGL(实际上是 JOGL,但同样的概念适用于此)应用程序,我有一个场景,在每个渲染通道上渲染大约 10k 个三角形。必须在每次渲染时计算三角形的比例和角度,因为三角形需要保持恒定的大小和相对于相机位置的旋转。

我尝试使用显示列表,然后在每次调用 glCallList 之前进行缩放/旋转。这行得通,但它使系统陷入困境。我正在考虑为此使用顶点缓冲区,但我不确定这是否是合适的方法,因为我需要在每次渲染时旋转/缩放。

谁能帮我指出在每个场景中渲染这么多三角形的正确方向?

编辑 - 这为问题提供了一些额外的上下文。

该应用程序是一个显示世界 3D 视图的地图应用程序。需要在表面上绘制某些形状,指向相对于指南针的方向,即 30 度。用户可以旋转 3d 视图,但形状必须在地球表面上保持平坦,并且还要指向指定的方向。

谢谢, 杰夫

【问题讨论】:

  • 所以对象是:a) 相同,并且 b) 相对于指南针旋转,因此当用户旋转视图时,它们的旋转方式与世界完全相同(加上它们的一点自己不断旋转)?另外,您使用的是哪个版本的 OpenGL?
  • 它们是相同的对象,是的。它们的旋转方式与世界的旋转方式并不完全相同,因为它们需要旋转才能在地球表面上保持平坦。我正在使用 JOGL 2.0。

标签: java opengl jogl


【解决方案1】:

就简单而言,使用 GL_DYNAMIC_DRAW 的顶点缓冲区和使用 GL_STATIC_DRAW 的索引缓冲区将是最好的。

如果您可以访问着色器(GLSL 或 HSL),请使用带有 GL_STATIC_DRAW 的顶点缓冲区和带有 GL_STATIC_DRAW 的索引缓冲区,并在顶点着色器中计算缩放和旋转。这样你就可以将一些工作转储到 GPU 上。 (如果工作一开始就占用大量 CPU)

也许事先做一些平截头体剔除?遮挡剔除?加快应用程序速度的最佳方法是减少渲染的三角形数量。

甚至可以使用一些线程。一个线程进行渲染,另一个线程计算比例和角度。

【讨论】:

  • 谢谢。当所有点都看不到时,一些简单的平截头体剔除在放大时很有帮助。当所有三角形都可见时,我仍然遇到一些麻烦,但这肯定是一个好的开始。
  • 剔除有助于解决填充率问题或顶点/片段处理能力问题。 10k 个三角形是一个很小的数量,所以这在我看来就像一个 CPU 问题 - 所以顶点缓冲区是要走的路,以减少绘制调用的数量(每帧单个 DrawArrays 或 DrawElements)。并且避免将线程和渲染拆分为不同的线程,这不是一种好的思维方式(渲染调用并不昂贵!)。如果需要,您可以并行化计算本身。
  • 看起来我的大部分时间都花在了实际的旋转计算上。我可能需要想办法减少这些。
【解决方案2】:

10.000 个三角形对于今天的普通笔记本 GPU 来说也不算多。

显示列表有点过时,这不是最有用的方法。

要做的第一件事是在一次绘制调用中绘制三角形 - 这应该很容易实现。

所以:

1) 将所有三角形数据(顶点坐标)保存在一个 Buffer 中(这就是 JOGL 处理顶点数组的方式,IIRC)。然后:

  • 在 CPU 上每帧更新此缓冲区并使用 glVertexPointerglDrawArrays 渲染所有缓冲区,
  • 创建一个 VBO 和(GL_DYNAMIC_DRAW 类型)并使用此缓冲区在每一帧更新它。一种更现代的方法,但在这种情况下,在速度方面与上述方法并没有太大区别。

然后,您将通过一个 glDrawArrays 调用渲染所有这 10.000 个三角形。

这仍然会在 CPU 上计算三角形,但会节省大量用于驱动程序调用的 CPU 时间 - 所有三角形将通过 PCI-E 立即发送并在眨眼间渲染。

如果还是太慢:

2) 想想您是否可以/想要将在三角形上完成的一些操作移至 GPU 并在顶点着色器中进行计算。在我知道你在做什么计算之前,我不能在这里说太多,但我真的希望 1) 就足够了。

如果您每帧有大约 10.000 次对 CallList 的调用,那绝对是您性能低下的罪魁祸首。

【讨论】:

  • 目前我所有的三角形都绘制在 (0.0f, 1.0f, 0.0f), (-0.5f, -1.0f, 0.0f), (0.5f, -1.0f, 0.0f) ,然后缩放并旋转到正确的位置。因为用户可以放大和缩小,我需要保持像素大小不变,坐标会改变。使用 glVertexPointer 和 glDrawArrays 时如何以不同方式缩放单个三角形?谢谢。
  • 好的,有解决方案,在我深入这里之前,您能否提供更详细的描述(您可以编辑您的问题并添加)您的应用程序实际执行的操作;您的数据是什么,它会以何种方式随时间变化?在更高的层次上讨论这个问题可能是可行的。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2020-04-05
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多