OpenGL在多个地方多次绘制相同的多边形

时间:2011-10-25 19:28:59

标签: performance opengl

在我的opengl应用程序中,我绘制了相同的多边形大约50k次但在屏幕上的不同点。在我目前的方法中,我做了以下几点:

  • 将多边形绘制到显示列表中
  • 对于多边形的每个实例,按下矩阵,平移到该点,缩放并适当旋转(每个点的缩放将相同,平移和旋转不会)。

然而,对于50k多边形,这是50k推送和弹出以及正确矩阵平移的计算以移动到正确的点。

我的同事也建议将整个场景绘制到一个缓冲区中,然后用一个翻译绘制整个缓冲区。这里的权衡是我们需要将所有多边形顶点保留在内存中而不仅仅是显示列表中,但我们不需要为每个顶点执行push / translate / scale / rotate / pop。

第一种方法是我们目前实施的方法,我更愿意看看我们是否可以改进,因为它需要进行重大改变才能做到第二种方式(但是,如果第二种方式更快,我们可以总是重写)。

所有这些推/弹都必须吗?有更快的方法吗?我应该担心这么多推/弹会降低性能吗?

2 个答案:

答案 0 :(得分:4)

这取决于你的最终目标。更新的OpenGL规范支持“几何实例化”功能。您可以将所有矩阵加载到缓冲区中,然后使用单个“绘制实例”调用(OpenGL 3+)绘制所有50k。如果您正在寻找临时修复,请至少将多边形加载到顶点缓冲区对象中。显示列表非常陈旧且已弃用。

这些50k多边形是否会独立移动?您将不得不忍受某种形式的“推/弹”(即使现代场景图不一定使用显式矩阵堆栈)。如果50k多边形是静态的,您可以将整个场景预编译为一个 VBO。这将使它快速呈现非常

答案 1 :(得分:3)

如果您可以假设最新版本的OpenGL(> = 3.1,IIRC),您可能需要查看glDrawArraysInstanced和/或glDrawElementsInstanced。对于旧版本,您可以使用glDrawArraysInstancedEXT / `glDrawElementsInstancedEXT,但它们是扩展程序,因此您必须按原样访问它们。

无论哪种方式,一般的想法都相当简单:你有一个网格,多个变换指定绘制网格的位置,然后你逐步完成并用不同的变换绘制网格。但是请注意,这并不是必然给出了重大改进 - 这取决于实现(甚至超过大多数事情)。