对于 2d 游戏,我需要每帧绘制许多纹理四边形。它们不共享任何顶点,应该被认为具有每帧都会改变的随机位置。因为我使用的是 opengl 3+,所以我不能再使用四边形(它已被删除)。我可以改为使用 2 个三角形来制作每个四边形,但这会产生大量冗余的重用数据,每帧都传递给 GPU。所以我想知道实现我的目标的最佳方法是什么?
我可以创建一个几何着色器,然后简单地将四边形左上角及其宽度、高度和纹理位置传递给它。然后着色器可以创建 2 个三角形。但是我认为这会很慢?
您有两种可能的方法:
您可能不应该使用几何着色器。它们通常并不意味着每一帧都运行,尽管它们当然可以。您会获得一些好处,尤其是使用的内存带宽非常少,但是硬件要求要高得多,API 也要严格得多。如果您的数据来自可以在那里优化的 CPU 计算,那么您最终可能会获得更好的性能;充其量您必须转换计算或将数据下载到视频内存中。
您绝对不想从几何着色器计算两个三角形,除非您的意思是每平方两个。着色器的主要好处是并行性,因此您需要遍历尽可能多的正方形并大批量绘制它们。批处理几乎总是会给您带来性能提升,并且有多种方法可以做到这一点。更改 API 中的转换之类的事情非常缓慢,最好避免(如果您使用的是 3.0+,可能不是什么大问题,但它曾经是一个大问题)。