在opengl 3+中快速生成许多2d纹理正方形(四边形)



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

我可以创建一个几何着色器,只需将其传递给四边形的左上角点以及它的宽度、高度和纹理位置。然后着色器可以创建这两个三角形。然而,我认为这会很慢吗?

您有两种潜在的方法:

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

您可能不应该使用几何体着色器。它们通常不意味着每帧都运行,尽管它们确实可以。你会得到一些好处,特别是使用的内存带宽很少,但硬件要求要高得多,API也要严格得多。如果你的数据来自CPU计算,可以在那里进行优化,你也可能最终获得更好的性能;充其量,你要么翻译计算结果,要么将数据下载到视频存储器中。

绝对不希望从几何体着色器计算两个三角形,除非是指每平方两个三角形。着色器的主要好处是并行性,因此您希望运行尽可能多的正方形,并以大批量绘制这些正方形。批处理几乎总是能提高性能,而且有多种方法可以做到这一点。像在API中更改转换这样的事情非常缓慢,最好避免(如果你使用3.0+,可能不是什么大问题,但它过去是一个大问题)。

最新更新