我们有一个(可能很大的)横向卷轴2D世界,里面有很多重复的瓷砖(例如地形,墙壁,水等)例如,有一些大的"山丘"可以非常高,但使用相同的小块"岩石"纹理进行渲染。
我想优化这个世界的存储和渲染(最好画一个大的四边形并对其应用相同的重复纹理,而不是单独绘制许多相邻的小四边形)。
有什么好方法可以做到这一点?目前,我看到了两个潜在的解决方案:
- 允许地图设计者手动指定"块"(重复切片的大矩形) 允许地图设计
- 者逐个切片地设计地图,然后自动计算区块(这样做的好算法是什么?
如果您开发过类似的游戏,很想听听您的特定解决方案。
由于您无论如何都不会绘制矩形(而是三角形),因此我建议选择第二个选项。此外,永远不要相信程序的用户。
第一个任务是将地图划分为具有相同纹理的多边形。由于您的地形基于格网,因此可以通过一种洪水填充与标记算法相结合来轻松实现,该算法如下所示:
- n := 0 // will be the polygon numbers
- Iterate over each grid cell
- If cell is marked, continue with next cell
- mark cell with n
- check adjacent cells for the same texture and mark them accordingly *
- n := n + 1
* 此步骤可以通过多种方式执行:洪水填充。此外,您应该为每个块存储一个边缘单元格。即具有至少一个具有不同纹理的相邻单元格的单元格。我们称之为种子细胞。
然后,使用多边形编号标记网格,并且 n 等于多边形计数。
下一步是提取多边形。这是种子细胞将有所帮助的地方。对于每个区块,从种子单元格开始,沿着区块的边缘运行,收集所有角点。这些角点将构成您的多边形。
之后,您将拥有一组多边形。最后一步是对多边形进行三角测量以进行渲染。这可以通过例如耳切/剪针算法或其他算法来实现。
如果像素着色器可供您使用,另一种方法是提供一个"tile-atlas"纹理,其中包含所有可能的瓷砖,这些纹理粘集成在光照贴图样式的纹理中,并提供更小的"tilemap"纹理(screenWidth/tileWidth X screenHeight/tileHeight),其中包含指向磁贴图中该位置的"磁贴类型"的单个组件。
然后,您可以绘制一个全屏、屏幕对齐的四边形,像素着色器将使用当前磁贴类型对"图块图集"进行采样,并将这些像素放在屏幕上。当前变化的纹理坐标以及四边形的宽度/高度知识可用于获取着色器内的当前像素位置。
然后可以根据需要更新"瓦片地图"纹理以更改当前级别。