在我的opengl应用程序中,我绘制相同的多边形大约50k次但在屏幕上的不同点.在我目前的方法中,我做了以下事情: 将多边形绘制到显示列表中一次 对于多边形的每个实例,按下矩阵,平移到
>将多边形绘制到显示列表中一次
>对于多边形的每个实例,按下矩阵,平移到该点,缩放并适当旋转(每个点的缩放将相同,平移和旋转不会).
然而,对于50k多边形,这是50k推送和弹出以及正确矩阵平移的计算以移动到正确的点.
我的同事还建议将整个场景绘制到缓冲区中,然后用一个翻译绘制整个缓冲区.这里的权衡是我们需要将所有多边形顶点保留在内存中而不仅仅是显示列表中,但我们不需要为每个顶点执行push / translate / scale / rotate / pop.
第一种方法是我们目前实施的方法,我更愿意看看我们是否可以改进,因为它需要进行重大改变才能做到第二种方式(但是,如果第二种方式更快,我们总是可以做到改写).
所有这些推/弹都是必要的吗?有更快的方法吗?我应该担心这么多推/弹会降低性能吗?
这取决于你的最终目标.更新的OpenGL规范支持“几何实例化”功能.您可以将所有矩阵加载到缓冲区中,然后使用单个“绘制实例”调用(OpenGL 3)绘制所有50k.如果您正在寻找临时修复,请至少将多边形加载到顶点缓冲区对象中.显示列表非常陈旧且已弃用.这些50k多边形是否会独立移动?您将不得不忍受某种形式的“推/弹”(即使现代场景图不一定使用显式矩阵堆栈).如果50k多边形是静态的,则可以将整个场景预编译为一个VBO.这将使它渲染得非常快.