我正在尝试确定在类似 Minecraft 的游戏中渲染一堆具有不同纹理的立方体的最有效方法是什么。
我发现了实例化渲染。我所做的是创建了一个“立方体模型”,它存储了立方体的所有顶点、法线和纹理坐标,我从中创建了一个数组缓冲区并将其传递给 GPU 一次。然后我创建了一个(平移向量,纹理索引)结构数组,并使用实例化渲染一遍又一遍地重绘同一个立方体,每次平移并使用适当的纹理。
(希望 Notch 不介意我使用他的纹理,直到我自己制作)
问题是并非所有 6 个面都将始终具有相同的纹理,我试图弄清楚如何使它们对于每种块类型都不同。我提出的两个解决方案是:
- 为每种模块类型使用不同的模型。这样我可以在每个顶点上指定不同的纹理坐标。我仍然可以使用实例化渲染,但我会为每种块类型分别进行一次传递。
- 传递 6 个“纹理索引”(每个面 1 个)而不是每个块 1 个。
第二种解决方案需要传递更多(可能是冗余的)数据。我不确定实例化渲染的好处有多大……所以我不知道是不是最好做,比如说,最多 256 个“通过”(每种块类型 1 个),或者“一个大传递”所有数据,并一次渲染每个块。
或者也许还有另一种我不知道的方法?