1

我们有一个(可能很大)横向滚动的 2D 世界,其中包含许多重复的图块(例如地形、墙壁、水等)。例如,有很大的“山丘”可能非常高,但使用相同的小块进行渲染一块“岩石”纹理。

我想优化这个世界的存储和渲染(最好画一个大四边形并对其应用相同的重复纹理,而不是单独画很多相邻的小四边形)。

有什么好的方法可以做到这一点?目前我看到了两个潜在的解决方案:

  1. 允许地图设计者手动指定“块”(重复图块的大矩形)
  2. 允许地图设计者逐个地块设计地图,然后自动计算块(有什么好的算法来做到这一点?)

如果您从事过类似的游戏,很想听听您的特定解决方案。

4

2 回答 2

0

由于您无论如何都不会绘制矩形(但三角形),我建议选择第二个选项。此外,永远不要相信你的程序的用户。

第一个任务是将地图划分为具有相同纹理的多边形。因为你的地形是基于网格的,这可以通过一种洪水填充结合标记算法很容易地实现,例如这样运行:

- 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

* 此步骤可以通过多种方式执行:FloodFill。此外,您应该为每个块存储一个边缘单元。即具有至少一个具有不同纹理的相邻单元的单元。我们称之为种子细胞。

然后你的网格用多边形编号标记,n 等于多边形计数。

下一步是提取多边形。这就是种子细胞将提供帮助的地方。对于每个块,从种子单元开始,沿着块的边缘运行,收集所有角点。这些角点将构成您的多边形。

之后你有一组多边形。最后一步是对多边形进行三角剖分以进行渲染。这可以通过例如剪耳算法或其他算法来实现。

于 2012-07-05T18:43:40.840 回答
0

如果您可以使用像素着色器,另一种方法是提供一个“tile-atlas”纹理,其中包含所有可能的瓦片,这些瓦片混合在一起形成一个光照贴图风格的纹理,并且还提供一个更小的“tilemap”纹理(screenWidth / tileWidth X screenHeight / tileHeight),其中包含一个指向 tilemap 中该位置的“tile type”的单个组件。

然后,您可以绘制一个全屏、屏幕对齐的四边形,像素着色器将使用当前的 tile-type 对“tile-atlas”进行采样,并将这些像素放在屏幕上。当前变化的纹理坐标以及四边形的宽度/高度可用于获取着色器内的当前像素位置。

然后可以根据需要更新“tilemap”纹理以更改当前级别。

于 2012-07-05T18:52:29.983 回答