《我的世界》是一款主要基于高度图的游戏,并使用该高度图信息使世界充满光明。据我了解,高度图中的最高点是受阳光影响区域的末端。上方的所有物体都被阳光照亮,下方的所有物体都受到附近8个半径范围内的光线的影响。
因此,如果您在世界之巅上有一个浮岛,那么位于其下方的所有事物都会被视为一个洞穴。当两个灯影响同一点时,较亮的灯将获胜(对此不确定)。
无论哪种方式,Minecrafts的照明模型都存在两个问题:首先,如果您的世界没有高度图,那么弄清楚究竟应该发出什么阳光以及什么不发出阳光变得很棘手。一种简单的方法是假设世界(在我的情况下)是一块漂浮的岩石,然后从两个方向遍历每个轴并找出岩石的开始和结束位置。但这并不能完全消除问题,因为岩石中的凹痕不应该处于黑暗中。
Minecraft本身会将光信息与有关块材料的信息一起缓存在其块中。因此,只有在世界被修改的情况下,照明才必须更新。不幸的是,该过程在更新上仍然相当缓慢,并且在快速更改灯光时,人们可以看到照明落后。如果很多块发生变化(TNT,日落等),并且您没有运行最快的计算机(或Mac上的Java),则尤其如此。
从我对3D图形照明的了解仍然有限,像Minecraft这样的世界应该不是最大的问题。您将如何解决这个问题?
我认为体素世界中照明的基本要求是
- 更新速度足够快,以至于可能在单个帧中发生。一个人可能可以在图形设备中进行照明并将更改后的照明信息下载到主RAM。
- 灯光信息必须能够快速用于主要游戏逻辑,因此不能完全基于图形设备:推理:灯光会影响草的生长,怪物的产卵等。
- 灯光更新必须是局部的,或者有其他一些限制,这样就不必重新照明可能很大的整个世界。
主要思想是使灯光更新更快,但不一定更美观。对于一般的灯光渲染性能改进,可以很容易地在其中添加SSAO,这将带来更好的效果。