《我的世界》世界中的照明


10

《我的世界》是一款主要基于高度图的游戏,并使用该高度图信息使世界充满光明。据我了解,高度图中的最高点是受阳光影响区域的末端。上方的所有物体都被阳光照亮,下方的所有物体都受到附近8个半径范围内的光线的影响。

因此,如果您在世界之巅上有一个浮岛,那么位于其下方的所有事物都会被视为一个洞穴。当两个灯影响同一点时,较亮的灯将获胜(对此不确定)。

无论哪种方式,Minecrafts的照明模型都存在两个问题:首先,如果您的世界没有高度图,那么弄清楚究竟应该发出什么阳光以及什么不发出阳光变得很棘手。一种简单的方法是假设世界(在我的情况下)是一块漂浮的岩石,然后从两个方向遍历每个轴并找出岩石的开始和结束位置。但这并不能完全消除问题,因为岩石中的凹痕不应该处于黑暗中。

Minecraft本身会将光信息与有关块材料的信息一起缓存在其块中。因此,只有在世界被修改的情况下,照明才必须更新。不幸的是,该过程在更新上仍然相当缓慢,并且在快速更改灯光时,人们可以看到照明落后。如果很多块发生变化(TNT,日落等),并且您没有运行最快的计算机(或Mac上的Java),则尤其如此。

从我对3D图形照明的了解仍然有限,像Minecraft这样的世界应该不是最大的问题。您将如何解决这个问题?

我认为体素世界中照明的基本要求是

  1. 更新速度足够快,以至于可能在单个帧中发生。一个人可能可以在图形设备中进行照明并将更改后的照明信息下载到主RAM。
  2. 灯光信息必须能够快速用于主要游戏逻辑,因此不能完全基于图形设备:推理:灯光会影响草的生长,怪物的产卵等。
  3. 灯光更新必须是局部的,或者有其他一些限制,这样就不必重新照明可能很大的整个世界。

主要思想是使灯光更新更快,但不一定更美观。对于一般的灯光渲染性能改进,可以很容易地在其中添加SSAO,这将带来更好的效果。

Answers:


7

Minecraft中的光照是异步计算的,并烘焙到几何体中。它不是实时完成的。

每个体素可能以单个字节(或2个字节)的形式存储该体素的照明,缺口使用分层方法来使昼夜循环成为可能。只有16个光水平。为了照亮世界,Minecraft进行了2次传递。一种用于日光,另一种用于将光传播或泛滥成洞穴等。照明是局部的,因为任何光源最多只能传播16个街区之外的光。水和熔岩的工作方式几乎相同。

有关更多信息,请访问他的博客:http : //notch.tumblr.com/post/434902871/per-request-this-is-how-the-new-lighting-will-work


我知道。我想我是在上面写的(减去亮度4位分辨率)。
Armin Ronacher 2010年

1

您是否可以不使用GPU渲染对结果进行纹理化和双缓冲,以便始终获得可用于回读每一帧的照​​明信息?

您如何组织照明数据完全取决于您,但是我不明白为什么如果您想做的只是提高照明算法的速度,那么这不应该成为调查的首选。


正是我在想的。与大多数CPU不同,几乎所有GPU都是为这种大规模并行计算而设计的。
格兰特·彼得斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.