体素世界里的光:真实灯光还是泛洪填充?
玩家在基地里放了一盏发光灯。从技术上讲会发生什么?这个看似天真的问题,引发了我们的一个根本性决定——而答案恰好是一个很好的例子,说明“更现代”的方案并不总是更好。
方案 A:真正的 Unity 灯光。每个发光方块都变成一个点光源,由引擎来计算一切。看起来很棒——但无法扩展。一个体素世界的视野里可能有几百个发光方块;这么多实时点光源会让任何 GPU 汗流浃背,浏览器版本就更不用说了。
方案 B:泛洪填充光照。这个类型的经典做法:光是每个方块上的一个数值,从光源向外扩散,每走一步就递减。便宜得要命,光源想要多少有多少——但结果看起来很平,因为光没有方向。灯旁边的墙壁和下面的地面一样亮。
我们的选择:带方向的泛洪填充。我们坚持用泛洪填充,但教会了它方向信息:光知道自己从哪个方向来,表面也就相应地被照得不同。结果会在生成网格时烘焙进区块网格里——运行时几乎不花任何代价,却比传统的方块光看起来明显更立体。
我们从此把这个教训带到了各处:先问清楚这个类型真正的问题是什么(这里是:光源非常多,几何体是静态的),然后再选技术。真实灯光解决的是一个我们没有的问题——还会制造出一个我们解决不了的问题。
留言