本帖最后由 SQwatermark 于 2020-9-12 22:29 编辑

前言
Introduction
本文的标题是 Making Lightmaps - An MCPatcher Tutorial,翻译过来就是 "制作光照贴图 —— 一篇 MCPatcher 教程"。

MCPatcher 早就没人用了,但是 OptiFine 继承并发扬了 MCPatcher 的绝大部分功能。这使得这篇原本为 MCPatcher 撰写的文章至今适用于 OptiFine。

光照贴图一直是 OptiFine 功能中的一个难点,或者说,OptiFine 中凡是涉及颜色映射的都是难点,因为要解释清楚需要大量的配图。而这篇文章使用了丰富的图案和实例,将光照贴图解释得简明易懂。十分难得。

我将这篇文章翻译为中文,希望可以帮助在制作光照贴图时遇到困难的创作者们。由于我没有能力深入阅读MC和OptiFine渲染相关代码,无法保证本文中一些解释的准确性,只能照本宣科地翻译,还请各位指正。

另外附上pdf版:
提取码:2ucn
正文
Main body
制作光照贴图
--- 一篇 MCPatcher 教程 ---

欢迎阅读我的光照贴图(lightmap)教程。光照贴图是 MCPatcher 最难于理解的部分之一。不像 CTM 或者 CIT,光照贴图没有扩展配置文件。想要理解光照贴图,不是要掌握怎么写配置文件,而是要弄清楚光照贴图中的每一个像素是怎么转换为游戏中你所看见的光照的。从这方面来说,光照贴图是 MCPatcher 中一个有些怪异的功能,需要进行一些解释。

在这个教程中,你将了解光照贴图的每一部分是如何工作的,它们表示什么意思,这些部分又是如何组合起来的,最重要的是如何为你的资源包制作美观的光照贴图。

Tip:注意绿色文本:当我写教程时,我会用绿色文本写一些注释。通常是有用的提醒或者是一些拓展知识。留心它们,因为它们可能会有所帮助。

重要:你需要 MCPATCHER:我希望可以阻止这个问题,没错,这个功能需要 MCPatcher。它不会在原版 Minecraft 起作用。我不会回答再问这个问题的人。



1. 模板和文件布局:
在开始前,一个展示光照贴图是如何工作的模板会有所帮助。如果对颜色的布局没有一个基本的了解,教程剩下的部分就会完全失去意义。

光照贴图的高度要么是32像素,要么是64像素,这取决于你是否想要包含夜视部分,但它可以是任何宽度。为了便于理解,我为三种常见宽度的光照贴图制作了模板:16像素宽、32像素宽和64像素宽。你可以从下面的隐藏文字中保存它们。注意,它们都不包含夜视部分,这部分将会在稍后介绍。

Tip:为什么有不同的宽度?:不同宽度的光照贴图之间唯一的区别就是,在日出和日落期间,它们的光照颜色变化的精细程度不同。如果你不在意这一点,就用16像素宽的,这样会少一些麻烦。

重要:不要调整光照贴图的大小:光照贴图是资源包中少有的不能调整大小的东西,即便你在制作一个高清资源包。因为对于光照贴图来说,每一个像素都十分重要,缩放一点就会让 MCPatcher 完全崩溃。因此,即便你在制作高清资源包,也不要调整光照贴图的大小。

文件名和位置:
所有光照贴图都要放在资源包的 "\assets\minecraft\mcpatcher\lightmap" 路径下,资源包可以是文件夹或 .zip 压缩文件格式。"world0.png" 用于主世界,相应地 "world-1.png" 和 "world1.png" 分别用于下界和末地。(译注:1.13以上的版本请把路径中的 mcpatcher 换成 optifine)



2. 天空光照贴图:
光照贴图分为几个部分。最上方的16行像素永远用于处理来自天空的光照。(译注:本节只讨论光照贴图最上方的16行,下文中提到的 "最上方" 和 "最下方" 都是在此范围内讨论的)

Tip:只适用于主世界:虽然本节中的信息 在技术上 可用于Minecraft的所有维度,但事实上只对于主世界有用。这在末地和下界的光照贴图的章节中有更为详细的解释。如果你不打算为主世界制作光照贴图,跳过本节,直接阅读光源贴图部分。

布局:
光照贴图最上面的部分,也就是处理天空光照的部分,是迄今为止最难于处理的部分,主要是因为没有足够的有关它如何工作的好的解释。

下面这张图解释了先前给出的模板是如何工作的:
你可能注意到上图中的两个箭头,分别标注了 "暴露在天空下的程度(Sky Exposure)" 和 "一天中的时刻(Time of Day)"。事情就是从这里开始变得复杂的。如果你上过高等数学课程,看到这样的线条可能让你想到网格上的图形点。本质上这正是你在做的事。决定了方块亮度和颜色的像素点是根据方块暴露在天空(不一定是太阳)下的程度和一天中的时间定位的。
(译注:为了显得更学术和简洁些,下面把 "sky exposure" 翻译成 "天空曝光",将 "Time of Day" 直接翻译成 "时刻")

理解这两个轴如何运作、如何相互作用,是理解光照贴图顶端部分的关键。

天空曝光(Sky Exposure):
光照贴图上半部分(16行像素)的纵轴是方块的天空曝光。最下方的一行是最大天空曝光。这表示直接暴露在天空之下,上方没有任何阻碍光线传播的方块。最顶端的一行表示无天空曝光,用于距离暴露在天空下的方块超过 15 个方块的位置。

注意,我特意将此称为 "sky exposure" 而不是别的指南或教程中常用的 "sunlight"。原因很简单:纵轴根本不取决于有没有太阳。最下面一行表示阳光直射或者月光直射,其沿着横轴的变化取决于当前时刻。

这里有一张插图,可以帮助你想象不同的 sky exposure 对应哪一行像素。
Tip:洞穴的深处: 注意最上面的一行表示不受天空影响。很多材质作者都犯过这样一个错误,他们让最上方一行的颜色或亮度根据时刻而变化,而实际上来自天空的光照不应该对这里产生任何影响。如果你想要写实效果,请尝试将最上面一行涂上同一种颜色。另一方面,如果你想要身在地底也知道当前时刻的话,也可以通过这一行的颜色变化来让不同时刻的光线产生变化。

Tip:我的 (天空) 光照等级是多少:需要一个获取天空曝光的简便方法?按 F3 开启调试界面并在倒数第二行寻找 "sl:" 。这表示你暴露在天空下的程度。15 是光照贴图的底下一排,而 0 是最顶端的一排。

译注:
在当前的版本中,调试界面左侧有一行叫做 Client Light,下面给出Minecraft中文wiki调试界面条中的解释:
客户端的光照。第一个数字显示玩家脚部位置的总光照等级。需要注意的是,此数值为“天空光照”和方块光照二者的较大值。但“天空光照”不代表游戏世界中的实际光照,譬如是否处于夜晚、雷暴等。 第二个数字显示示玩家脚部位置能够获取的天空光照。同样有上述的注意事项。 第三个数字显示玩家脚部位置来自其他方块(如火把)的光照等级。


时刻(
Time of Day):
横轴主要表示时刻,但最右边也有独立的用于表示闪电的部分。图片的最左侧是夜晚。最右侧是闪电。白天紧挨在闪电的左侧。位于白天和黑夜之间的宽阔区域是日出和日落的过渡部分。

日出和日落的过渡是光照贴图可以是各种宽度的原因。你可以用更宽的贴图来更好地控制太阳升起和落下时的颜色变化,但除此之外没有别的作用。没有办法让日出和日落具有不同的颜色或光照等级;这两种过渡使用贴图的同一部分,但沿横轴的不同方向移动。

下面这张图示范了随着时间的变化横轴位置的改变(日出):

闪电,雷暴,和雨
在用于白天的列的右侧有一个或多个列。在大多数情况下,只有最右边一列是用于闪电的。在更宽的贴图中,可能在白天的列和闪电的列之间还会有几列。这些列显然是没用的,这很可能是因为 MCPatcher 计算不同时间对应的位置时,白天在坐标轴宽度的 15/16 的位置,而不是简单地将从右往左数第二列作为白天的绝对位置。

在模板中,有两个特别标出的列:一个用于雨,另一个用于雷暴。当有关天气现象发生在正常情况下的白天时,就会使用这些列。不像用于闪电的列,这两列也是正常的日出和日落的一部分,所以你不能将这两列单独上色以用于天气。我把它们标出来,这样你就不会奇怪为什么在下雨的时候世界变成一种奇怪的颜色了。

需要注意的是,只有用于闪电的列是精准的。用于雨和雷暴的列并不精确,它们会从邻近的列中提取一些颜色,这是由于 Minecraft 会尝试在日出和日落过渡时混合颜色。如果你没有 准确地 得到你想要的颜色,尝试将颜色轻轻地匀进左右两侧的列中以增强效果。

将它们组织起来:既然你已经了解了光照贴图的每个轴的作用,是时候将两个轴组织起来了。最暗的颜色将会在颜色映射的最左上方。在最上方是因为这里距离天空最远,因此也距离阳光最远,在最左边是因为这里表示夜晚,因此光线最少。(译者吐槽:你刚才才说了最上面一行要保持一样的颜色呢?)最亮的点应该在颜色映射的右下方,因为它表示白天直接暴露在天空之下的地方。

记住最右边的一列是为闪电预留的。填充这块区域的一个简便方法是借用为白天准备的列。这是可行的,而且很大程度上不易被发现,因为 Minecraft 将在短短几帧内把一列非常暗的区域变为闪电光柱。闪电本身也不会持续太长时间,所以大部分人不会注意到白天和闪电的亮度相同。如果你想掩盖这种偷懒行为,可以考虑把闪电调整成和日光不同的色相。

这儿有一个将一天中的时刻和暴露在天空下的程度综合考虑的例子:

如果你加载示例资源包(在下方的下载链接中下载),你会注意到日落时光照从黄色变为橙色,再变为红色、紫色,最终变成晚上的深蓝色。你可以轻易在这张颜色映射图上找到这些变化。同样地,如果你将天气设置为雷暴(开启作弊的情况下在聊天栏中输入 "/weather thunder"),你会看到在打闪时世界短暂地变成了一种亮青色。同样,可以轻易在示例的颜色映射图的最右侧找到这种颜色。

Tip:一次一列:如果你不知道怎样让光照看起来正常,一次只绘制一列。从表示白天的光线的那一列开始。按照你所想的在最底端的像素画上完整的日光,在最顶端画上深处的洞穴的光线。当你得到想要的效果之后,绘制表示夜间光线的列。然后绘制表示闪电的列。最后,处理表示日出和日落的过渡的中间列。如果必要的话,不要害怕将时间停下("/gamerule doDaylightCycle false"),一次播放几刻,来找到日出和日落的每个时刻的最佳效果。


3. 光源贴图:
光照贴图接下来的16行处理来自(非天空的)光源的光照,例如火把、荧石、红石灯、杰克的南瓜灯,等等。(译注:这一节只讨论光照贴图的第17到32行,所谓的最上方和最下方都是在此范围内的。我觉得将所谓的光源光照或者火把光照称为方块光照更好一些,实际上官方给出的就是方块光照,但是这里遵从原文翻译了)

Tip:涂黑以用于测试:在你测试上个部分(天空光照)时,将用于光源的这16行涂黑。这么做的好处是,你不会受到任何来自普通光源的影响,可以轻易看到纯净的天空光照是如何影响你的世界的。同样,当测试这一部分(光源贴图)时,将天空光照部分涂黑也是明智之举。这样你可以确定你看到的颜色和光强都来自普通光源。别忘记备份,以防意外丢失一些东西!

光照等级:这部分的光照贴图更易于理解,它有一个真实具体的值,这是由于为方块的面使用哪一行光照贴图的计算方式。实际上,它使用那个方块的光照等级

Tip:我的(光源的)光照等级是多少?:正如你可以在调试界面找到天空光照等级,你也可以在此找到光源光照等级。按下 F3 开启调试界面,在倒数第二行找到 "bl:"。15表示光源光照贴图最下方一行,0表示最上方一行。记住这是你头部位置的光照(译注:并不是头部而是脚部,可能是作者弄错了)。要在游戏内查看光源光照的效果,最好的办法是在深深的洞穴中将一个荧石方块嵌入一块平坦的墙壁,在和眼部平齐的位置,周围没有别的光源。看向调试界面上的坐标或者墙面上同高度的其他方块,数出距离荧石方块的距离,并和光照贴图的行进行比较。(译注:如果你没看前面对Minecraft中文wiki调试界面词条的引用的话,翻回去看一下)

就像光照贴图的前16行中最上方一行最表示远离光照一样,光照贴图的这一部分的最上方一行表示方块未受到任何来自光源的光照。类似地,最下方一行表示可能的最强光线。最下方一行在游戏里很少见到,因为那个光照等级通常在发出最强光线的光源内部。通常唯一可以看到这种强度的光的地方是流动的岩浆。任何时候流动的岩浆都不会填充整个方块,最强光照等级可以从岩浆的斜面处看到。

这儿有一张彩色的颜色映射图,实例展示了这个概念:

光线闪烁
重要:请跳过这一部分: 我们很少使用光线闪烁,因为它非常烦人,而且可能在对颜色和光线变化敏感的人群中导致疾病。因此,这一个章节被折叠起来了。如果你不想使用光线闪烁(你也不应该用),只需要让光照贴图的每一行中的所有像素保持同一种颜色,就像之前的例子中展示的那样。


光照是如何计算的:
现在你已经做好了光照贴图的两部分,而且已经将它们放在了同一张图片中,天空光照在上,光源光照在下。你可能已经在游戏中测试过了,并且结果可能不是你预期的那样。

Minecraft计算方块的面受到的光照的方式是首先计算刚才讨论的两张图中,分别应该使用哪个像素。

对于第一张图,它选择既符合符合暴露在天空下的程度,也符合一天中的时刻(或者是闪电和雨雪)的像素。对于第二张图,它会在符合方块受到非天空光源的光照等级的行中随机选择一个像素。

一旦Minecraft选择了这两个值,它就会对其进行比较,选择两者中较亮的那个来作为方块受到的光照。它不会将两者的颜色混合起来,它只会选择较亮的那个。

这就是为什么,比方说,如果你的天空光照和方块光照使用了完全不同的方案,那么哪个方块是被光源照亮的,哪个方块是被天空照亮的就会因为颜色差异而变得很明显。如果方块光照比阳光更亮,那么它就会胜出。如果你不理解这一点,仅仅是怎么好看怎么来,可能你最终会困惑为什么光照要么是按照天空光照贴图,要么是按照那个光源光照贴图,尽管这是你不希望发生的。


4. 夜视:
在你获得了你想要的光照之后,你可能决定要改变具有夜视效果时看到的光线效果。这一步完全是可选的,所有如果你觉得原版的夜视效果看起来不错,就没必要在这件事上耽误。

修改夜视效果的方法是在原先做好的图下方添加另一部分(33-64)。这些贴图(指33-48,49-64两部分),信不信由你,和上面的两种光照贴图的做法是相同的。它们工作原理完全一样。唯一的区别就是你有机会来选择不同的,通常是更亮的,夜视效果。例如,在夜视效果下,你可能想让你的阴影显示中等的青色,而不是一种非常深的蓝色。你可以自由选择这些贴图的颜色和值,使用和你制作前两张夜视贴图相同的方式。

这是一个示例贴图,以及它是如何显示环境的:

由于普通和夜视光照贴图以相同方式工作,如果你交换整张光照贴图的上下两部分,你就可以在正常情况下显示夜视效果,在夜视情况下显示正常效果。基于同样的原因,你的光照贴图的夜视部分并不一定可以在夜视状态下使视觉效果变亮。如果你仅仅是把普通光照贴图复制了一份而没有调节亮度,玩家即便在夜视药水的影响下也只能有正常的视觉效果。你可以成为一个巨魔,让夜视效果变得更,使玩家在黑夜中更 看清道路。



5. 下界和末地的光照贴图:
下界和末地的光照贴图和主世界的光照贴图是同一种做法。但是有一个非常重要的区别:下界和末地没有白天和夜晚,也没有天空光照

这意味着什么?唔,这意味着整个天空光照,颜色映射的一半都可以用颜料桶填充为一种颜色!光照贴图的制作中最复杂耗时的部分可以点一下就完成!
有必要知道,特别是在下界,即便可以暴露在天空下(例如使用深色橡木卡bug或者创造模式破坏了基岩层),Minecraft依然不会将其视为暴露在天空下,因为这个维度在设计时就没考虑过会暴露在天空下。末地被设计成天空没有日月,并不发光,所以天空曝光是无意义的。

自然你仍然需要决定在没有火把的情况下的光照颜色,但这会相对简单,不需要过多的尝试和错误。

Tip:使用16像素宽!:制作超过16像素宽的光照贴图的唯一原因就是可以更精确地控制日出和日落时的颜色变化。末地和下界没有日出和日落,自然也就不需要更宽的光照贴图,除非你想让方块光照有更多的闪烁变化。16像素是 MCPatcher 接受的最窄像素,所以即便你不需要多余的空间,你的贴图至少也得16像素宽。

6. 下载一些例子:
还是有些困惑?想要更实际的例子?你可以尝试一些预先做好的东西,不用担心毁坏你自己的,如何?好,走你!

>> 下载 <<
这个资源包,以及其中的所有光照贴图,都按照 署名 4.0 国际 (CC BY 4.0) 协议发布。

注意在默认情况下只有最终例子被加载了。你可以打开lightmap文件夹,通过重命名文件来切换加载的例子。这需要花一点点功夫,但是实在没办法制作一个能让这个主题中所有例子都默认加载的资源包。

译注:
如果链接失效了,或者你无法连接到其所在网络,可以下载我发在网盘里的:
提取码:x3bl

7. 疑难解答:
即将推出。在此主题下回复你的问题。如果你的问题很有价值,回答可能会放在这个小节!

8. 常见问题:
Q: 使用光照贴图需要 MCPatcher 吗?
A: 我已经在这个页面中提了不下三次,所以......没错。你需要。
译注:MCPatcher已经过时了,请用 OptiFine!

Q: 这在 Optifine 中起效果吗?
A: 可能。根据 Optifine 的主题帖是可以的,但是我也听说 Optifine 在使用光照贴图时崩溃。试一试并在这个帖子里做出回复。
译注:如今至少在大部分版本的 OptiFine 中使用光照贴图都是没问题的。

Q: 光照贴图会影响怪物生成吗?
A: 不会。怪物会依据游戏计算出来的光照等级生成,这和游戏中显示的光照一点关系都没有。光照贴图纯粹是为了美观。

Q: 如果在主世界进入下界或末地生物群系,光照贴图会改变吗?
A: 不会,光照贴图只取决于维度,和生物群系无关。如果你想看到为下界和末地制作的光照贴图,你必须进入这些维度。

9. 还有什么问题吗?
如果有什么你没有理解的,想要详细阐述的,或者只是想不明白的,请随意在这个帖子下面回复,会有人(可能是我)试图帮你解决问题。

请表述清楚你的问题所在。说:“它没有正常工作” 无助于解决你的问题。如果可能的话,请提供屏幕截图。同样,请准备好提供一份有问题的光照贴图文件的下载链接。有时我们只要看看你做了什么就可以告诉你哪里做错了。

希望这个主题帖能帮助到你们中对 MCPatcher 的这个功能感到困惑的人。

译注:可以在这个翻译帖下提出问题,我或者碰巧看到的人可能会帮助你解答,但也许去原贴提问会受到更专业的回答,文章的原作者至今仍然在 Minecraft Forum 活跃(是该论坛的一位版主)。
字数统计
Statistic

小组:幽篁流觞(RMA)