OpenGL - 推荐的渲染大量实体的方法,每个实体都具有独特的程序纹理

OpenGL - recommended way to render lots of entities, each with unique procedural textures

考虑具有以下属性的二维模拟:

如果我没记错的话,这个问题一般有两种解决方法:

  1. 在运行时间使用每个实体新生成的纹理动态更新纹理图集。当一个实体死亡时,移除它的纹理并为新的留空 space。这里的优点是您只需要 1 个绘制调用。缺点是纹理图集让系统无法使用。如果你有一个 2048x2048 的图集,而你的精灵是 64x64,那么在 运行 之前你只能生成 1024 个精灵 space。如果每个实体包含 5 个用于动画目的的精灵,那么任何时候只能存在大约 200 个实体。您还必须在 运行 时间不断更新纹理。
  2. 为每个单独的敌人创建一个单独的纹理对象,并为每个敌人进行绘制调用。这里的优点是您可以根据需要(在内存限制内)不断创建新纹理。缺点显然是潜在的大量绘制调用(仅实体高达 5,000,不包括背景纹理等)

所以#1好像完全不行了。 #2 是实现此目的的唯一方法,还是有我没有考虑过的更好的方法?

从您的描述中看不出为什么 #1 没有问题。这是绘制多个小精灵的常用方法。您不限于 1024 个精灵,因为您可以创建多个图集。即使一次批处理 200 个实体,也比一个一个地绘制要好得多。 不过,生成精灵的机制似乎很重要。如果你每帧都更新整个图集,你可能想做点别的事情。

您可以只使用多个图集,并且仍然可以通过具有附加的顶点属性(或 3D 纹理坐标)告诉着色器使用哪个图集来在单个调用中进行绘制。

有几个选项:

  • 使用阵列纹理或 3D 纹理。
  • 将它们绑定到不同的纹理单元(您从 OpenGL 3.0 获得至少 16 个 IIRC)

数组纹理可能是最优雅的解决方案,它是 3.0 的核心。