对于类似Minecraft的游戏,在每侧渲染具有不同纹理的立方体的有效方法?

mpe*_*pen 3 opengl 3d textures voxel

我试图决定在类似Minecraft的游戏中渲染一堆具有不同纹理的立方体的最有效方法是什么.

我发现了实例渲染.我所做的是我创建了一个单独的"立方体模型",它存储了立方体的所有顶点,法线和纹理坐标,我创建了一个数组缓冲区并将其传递给GPU一次.然后我创建了一个(平移矢量,纹理索引)结构数组,我使用实例渲染来反复重绘同一个立方体,每次翻译并使用适当的纹理.

(希望Notch不介意我使用他的纹理,直到我自己做)

问题是,并非所有6个边都将具有相同的纹理,并且我试图弄清楚如何使它们对于每个块类型都不同.我提出的两个解决方案是:

  1. 为每种块类型使用不同的模型.这样我就可以在每个顶点上指定不同的纹理坐标.我仍然可以使用实例渲染,但我会为每个块类型执行单独的传递.
  2. 传递6个"纹理索引"(每个面1个)而不是每个块1个.

第二种解决方案需要传递更多,可能是冗余的数据.我不确定实例化渲染的好处有多大......所以我不知道是否会更好,例如,最多256个"通过"(每个块类型1个)或"一个大"传递"包含所有数据,并在一次拍摄中渲染每个块.

或许还有另一种我不知道的方法?

Pio*_*zmo 6

我不认为你可以用实例有效地做到这一点.绝大多数面部/立方体永远不可见,您可以通过不渲染来节省大量时间.不幸的是,这使得每个立方体都成为不同

标准解决方案(以及它在Minecraft中的工作方式)是将您的地形划分为多个扇区.计算哪些面是可见的并将它们上传到GPU.当一个多维数据集发生变化时,你只需要重新上传它的扇区.渲染扇区时,您只需绘制基元而无需任何其他计算.

你可以根据稀疏的体素八叉树做一些事情.这是更多的工作,但你将能够有效和准确地分辨你的世界的哪些部分是可见的.