使用VBO在OpenGL中进行简单的2D剔除

时间:2012-06-13 22:48:30

标签: opengl vbo orthographic culling

出于性能原因,我正在考虑使用VBO而不是立即模式。我正在创建一个充满精灵的2D正交场景。我不想画出屏幕外的精灵。我通过检查它们相对于屏幕尺寸和相机位置的位置来做到这一点。

在即时模式下,这很简单;每个精灵都有draw方法。使用VBO这似乎并不重要;我一次渲染一个VBO的整个部分。我(我能想到)没有办法选择不渲染屏幕外的精灵。

1 个答案:

答案 0 :(得分:5)

我只是假设你确实为CPU上的精灵设置了动画,因为根据你的问题,这是唯一有意义的事情(否则,你最初会如何以立即模式绘制它们,你会怎样?跳过一些)。

从性能的角度来看,AGP / PCIe的行为很像硬盘。带宽很大,但访问时间非常明显。换句话说,完全转移是痛苦的,但是一旦你这样做,几千字节就没有什么区别。上传500个精灵并上传1000个精灵是一回事。

由于您在CPU上为精灵设置了动画,因此您已经必须每帧执行一次传输(glBufferSubDataglMapBuffer/glUnmapBuffer),没有别的办法。

请务必使用“新鲜”缓冲区,例如通过应用glBufferData(null) idiom。这可以避免管道停顿,允许OpenGL继续使用(绘制)缓冲区,同时为您提供不同的缓冲区(不知道)。稍后当它完成绘图时,它只是秘密地翻转缓冲区并抛弃旧的缓冲区。这样,你就可以获得良好的并行性(这是性能的关键,比剔除几千个顶点更重要)。

此外,显卡在剔除几何图形方面相当擅长(这包括丢弃在生成片段之前屏幕外的整个三角形)。数百?成千上万的?十万?没有任何问题。让显卡做到。

除非你有一百万个精灵,其中一半是一次可见而另一半不是,所以不可能连续写整个缓冲区而没有分支不仅仅是由于缓存和管道效应,速度更快,但速度更快。