我有一个openGL(实际上是JOGL,但这里有相同的概念)app,我有一个场景,在每个渲染过程中呈现大约10k个三角形。必须在每次渲染时计算三角形的比例和角度,因为三角形需要保持相对于摄像机位置的恒定大小和旋转。
我尝试使用显示列表,然后在每次调用glCallList
之前进行缩放/旋转。这是有效的,但它使系统爬行。我正在研究使用顶点缓冲区,但我不确定这是否是合适的方法,因为我需要在每次渲染时旋转/缩放。
有人可以帮助我指出在每个场景中渲染这么多三角形的正确方向吗?
编辑 - 这为问题提供了一些额外的背景信息。
该应用程序是一个地图应用程序,显示了世界的三维视图。需要在指向相对于罗盘的方向的表面上绘制某些形状,即30度。用户可以旋转三维视图,但形状必须保持平坦在地球表面上,并指向指定的方向。
感谢, 杰夫
答案 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)。然后:
glVertexPointer
和glDrawArrays
,GL_DYNAMIC_DRAW
类型)并使用此缓冲区每帧更新它。一种更现代的方法,但在这种情况下,速度方面与上述方法并没有太大区别。之后,您将通过一次glDrawArrays
调用渲染所有10.000个三角形。
这仍然会在CPU上计算三角形,但可以节省大量花在驱动程序调用上的CPU时间 - 所有三角形将立即通过PCI-E发送并瞬间渲染。 / p>
如果那仍然太慢:
2)想想你是否可以/想要将三角形上完成的一些操作移动到GPU并在顶点着色器中进行计算。在我知道你在做什么计算之前我不能说太多,但我真的希望1)就够了。
如果您每帧都有{000}个CallList
来电话,那肯定是您表现不佳的罪魁祸首。