我对Metal有一些经验,对Unity很有兴趣,熟悉设置网格,缓冲区和绘图的支持数据;但不是数学/着色器方面。我所挣扎的是如何获得无尽的滚动世界。因此,如果我向右侧移动,我可以看到左侧并继续前进。
这个应用将是一个无缝的地形,玩家可以永远向任何方向滚动,让它只是包裹。
我不想在绘制时复制一切并抵消它,这看起来非常低效。我希望有一种方法可以使用一些魔术矩阵数学或某种着色器来包装/绘制在平移地图时应该放置的东西。我已经搜遍了各种各样的指南或解释如何使这个工作,但没有想出任何东西。
我知道很多旧的(dos)游戏以某种方式做到了这一点,还有可能吗?有没有理由说这个行业似乎已经从这种类型的滚动中迁移出来(边缘与包裹相对)?
答案 0 :(得分:3)
我创建了一个simple example来展示你正在寻找的东西(我想)。
它的基本思想是使用drawPrimitives(type:vertexStart:vertexCount:instanceCount:)
上的MTLRenderCommandEncoder
方法在重复网格中绘制地图。作为实例计数,您希望传递要绘制的相同地图的数量,将其扩展到需要的位置,以便看不到它的结束位置。在我的例子中,我使用了一个简单的5x5网格。
为了让用户看不到地图的边缘,我们将计算他们的位置模1
(或地图的大小):
func didDrag(dx: CGFloat, dy: CGFloat) {
// Move user position on drag, adding 1 to not get below 0
x += Float(dx) * draggingSpeed + 1
z += Float(dy) * draggingSpeed + 1
x.formTruncatingRemainder(dividingBy: 1)
z.formTruncatingRemainder(dividingBy: 1)
}
它的外观如下:
答案 1 :(得分:0)
只是跟进我实际实施的内容。首先,我基本上有一个x,y点阵列,包括高度,地形类型和所有爵士乐。使用一些简单的%
和加法/减法,让点周围的节点生成三角形是微不足道的
在平局上,我计算第一个显示点和最后一个显示点,并计算这些点之间显示的三角形组。第一点/最后一点考虑到包装,然后有一个无尽的包装世界是非常微不足道的。对于每个组,翻译偏移量通过该组的统一矩阵传递,该矩阵将该区域定位在它应该属于的位置。
我是通过renderEncoder.setVertexBytes(&uniform, length:..., offset:...)