Java OpenGL渲染许多三角形

时间:2010-11-29 18:39:07

标签: java opengl jogl

我有一个openGL(实际上是JOGL,但这里有相同的概念)app,我有一个场景,在每个渲染过程中呈现大约10k个三角形。必须在每次渲染时计算三角形的比例和角度,因为三角形需要保持相对于摄像机位置的恒定大小和旋转。

我尝试使用显示列表,然后在每次调用glCallList之前进行缩放/旋转。这是有效的,但它使系统爬行。我正在研究使用顶点缓冲区,但我不确定这是否是合适的方法,因为我需要在每次渲染时旋转/缩放。

有人可以帮助我指出在每个场景中渲染这么多三角形的正确方向吗?

编辑 - 这为问题提供了一些额外的背景信息。

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

感谢, 杰夫

2 个答案:

答案 0 :(得分:5)

使用GL_DYNAMIC_DRAW的顶点缓冲区和带有GL_STATIC_DRAW的Indice缓冲区将是您在简单性方面可以做的最好的。

如果您有权访问着色器(GLSL或HSL),请使用带有GL_STATIC_DRAW的顶点缓冲区和带有GL_STATIC_DRAW的Indice缓冲区,并计算顶点着色器中的比例和旋转。这样你可以将一些工作转储到GPU上。 (如果工作开始时CPU很重)

也许在手前做一些截头剔除?遮挡剔除?加速应用程序的最佳方法是减少渲染的三角形数量。

甚至可能使用一些线程。一个要渲染的线程,另一个用于计算比例和角度。

答案 1 :(得分:1)

即使对于今天的普通笔记本GPU,10.000三角形也不是很大。

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

要做的第一件事就是在一次平局调用中绘制你的幻想 - 这应该很容易实现。

所以:

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

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

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

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

如果那仍然太慢:

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

如果您每帧都有{000}个CallList来电话,那肯定是您表现不佳的罪魁祸首。