0

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

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

4

1 回答 1

2

您有两种可能的方法:

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

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

您绝对不想从几何着色器计算两个三角形,除非您的意思是每平方两个。着色器的主要好处是并行性,因此您需要遍历尽可能多的正方形并大批量绘制它们。批处理几乎总是会给您带来性能提升,并且有多种方法可以做到这一点。更改 API 中的转换之类的事情非常缓慢,最好避免(如果您使用的是 3.0+,可能不是什么大问题,但它曾经是一个大问题)。

于 2013-02-10T00:17:51.400 回答