opengl 3+中许多2d纹理方块(四边形)的最快方式

时间:2013-02-10 00:08:44

标签: opengl 2d quad

对于2D游戏,我需要每帧绘制许多纹理四边形。它们不共享任何顶点,应该被认为具有随时改变每一帧的位置。当我使用opengl 3+时,我不能再使用四边形(它已被删除)。我可以使用2个三角形来制作每个四边形,但这会产生大量冗余重用数据,每帧传递给GPU。所以我想知道实现目标的最佳途径是什么?

我可以创建一个几何着色器,然后简单地将它传递给四边形的左上角以及它的宽度,高度和纹理位置。然后着色器可以创建2个三角形。但是我认为这会很慢?

1 个答案:

答案 0 :(得分:2)

您有两种可能的方法:

  • 使用trilist(不是条带)。尝试使用变换会非常慢,除非你有很多的正方形,否则数据不会那么重。如果您担心,可以优化顶点格式并将其降低到每个8或16个字节;请记住,PCIe 2.0 x16的带宽为每秒千兆字节,对于粒子系统等,一些megs是合理的。根据您的工作量,指数可能会有所帮助。
  • 使用一个或一小批三角形,索引并在缓冲区中,并使用着色器重新定位它们。这利用了批处理(用一组坐标绘制100个方块,更新着色器中的坐标,再次绘制)并节省内存,但您必须担心深度(在着色器中处理它)和其他一些细节。这不是最糟糕的事情,我无法肯定地说它好不好。

您可能不应该使用几何着色器。它们通常并不意味着每帧运行,尽管它们当然可以。您可以获得一些好处,特别是使用的内存带宽非常少,但硬件要求明显更高,API更加严格。如果您的数据来自可以在那里优化的CPU计算,那么您最终也可能获得更好的性能;至多你必须翻译计算或将数据下载到视频内存。

您绝对不希望从几何着色器计算两个三角形,除非您指的是每平方两个。着色器的主要好处是并行性,因此您希望尽可能多地使用正方形并大量绘制它们。批处理几乎总能为您带来性能提升,并且有多种方法可以实现。更改API中的转换之类的事情非常缓慢且最好避免(如果您使用的是3.0以上,可能不是很大的问题,但它曾经是一个巨大的问题)。