无框玻璃的开发
很久很久,久到我记不清时间①的以前,我开发了一个关于玻璃的纹理包。当时我在玩一张“玩家周围都会变成玻璃”的生存地图②,其实也没那么难,因为我的触及距离正好比替换为玻璃的范围多一点点,只不过当时我感觉新奇罢了。
那时候,我发现这么多玻璃看着眼花缭乱,虽然有背面剔除系统,可是玻璃表面都是白色方框,看起来不好。所以我自制了一个纹理包,把玻璃的纹理替换成了半透明的淡蓝色。下面是我当时写的manifest.json文件③。
{
"format_version": 2,
"header": {
"description": "更通透的玻璃!",
"name": "通透玻璃",
"uuid": "fe9f8377-0000-432a-8730-8d07358e2e58",
"version": ,
"min_engine_version": [ 1, 13, 0 ]
},
"modules": [
{
"description": "glass",
"type": "resources",
"uuid": "7931563b-68ad-4f4f-aa97-d9816439aa33",
"version":
}
]
}
制作这个纹理包耗时最长的不是这个文件,而是那个纹理。我把它的透明度改了又改,一开始发现我认为的半透明到了游戏里几乎是不透明④,后来才改好。进入游戏,现在我就可以清楚地看到玻璃后方有什么了,一目了然。
那时候,我看到一些视频里Java版的通透玻璃,如果把那些玻璃并排放下,它们之间的白框会消失。
我曾经因此搜索过无框玻璃的纹理包,结果要么不能用⑤,要么就是改成了半透明。我又寻找了好久,结果没有一个像我想的那样正常运作。
后来,过了一段时间,我开始开发添补附加包。到了2022年5月⑥,我添加了一个新方块——“无框玻璃”,可以用8个玻璃围成一圈合成8个。我只是单纯地擦除了玻璃周围的一圈白色边框,进入游戏后,却发现无框玻璃放下后是黑色的,在物品栏中才是透明的。那时候我还不知道有“渲染方法”这种说法,只是听网上传言说玻璃的纹理必须有透明度不为0的像素,觉得很有道理——不然为什么不直接把玻璃改成透明,而不是蓝色半透明呢?于是我用透明度为1%的青色填充了我的纹理的剩余部分,结果这个玻璃放下以后透明部分依旧是黑色的,拿在手里时,透明部分反而变成了纯青色。
我又折腾了好久,一度考虑废弃这个方块。但我偶然得知了渲染方法的存在——其实只是得到了一个示例⑦,把它复制进我那个文件里,再打开游戏,才成功了。后来,手持时的青色纹理在1.0.0版本⑧被修复了。从那以后,这个方块一年多没有被更改过。
这期间,我发现其实有一些附加包实现了玻璃纹理的连接,但它们新增的方块文件很复杂,似乎还用了模型、骨骼可见性等内容。我曾经下载过那样的附加包,装到游戏里之后,却发现有警告说“方块排列数量⑨过多”。方块排列的限制是65536个,按理说很难达到,除非拥有巨量方块排列的方块被放置了很多。但我只放置了十几个玻璃方块,这说明代码很复杂,也需要很多方块状态。
更重要的是,进入世界后,我发现只有玻璃的底面正常渲染,其他面都是透明的,而且透过其他面看不到底面,这一度让我认为这些玻璃方块根本没有渲染。当然,底面的渲染效果是好的,但其他面的透明是我不能接受的。
最近,我发现了新的渲染方法,就把这个方法应用到了无框玻璃上。这就是我从1.0.0更新以来,对它做的唯一一次更改。
前几天,形势又变化了。上次下载别人的附加包时,我根本看不懂;一段时间过去了,我觉得我又可以了。不仅可以了,还觉得自己能原创地做出来无框玻璃了——于是我开始在跑操时⑩构思新的无框玻璃,包括实现的方法,模型的制作,数据的填写等等。
思来想去,我最后才决定使用骨骼可见性的方法。首先就是在手机上制作模型,然后一通操作猛如虎地把各种代码片段从添补附加包里复制出来,总算是写好了。我没有使用方块排列,但使用了6个布尔值⑪,因此方块排列数量是2^6=64,放置多于1024个玻璃块后才会超过限制。如果使用方块剔除可能会更简单,而且会把方块排列数量降到0⑫,但官方还没有放出如何引用方块剔除文件,我只好用骨骼可见性的方法。
第一次测试在游戏里看起来就是这样。如你所见,X轴⑬的渲染搞反了,底面渲染也有问题。https://pic.imgdb.cn/item/65ed79eb9f345e8d0365ab34.jpg
修复了X轴的渲染问题以后,我进行了第二次测试。https://pic.imgdb.cn/item/65ed7a739f345e8d0368481f.jpg
修复了底面渲染的问题,我第三次进入游戏。这次就可以了,基本上没问题了。而且这也相当于做好了各染色玻璃的无框版本,只需要更改纹理名称就可以了,这个方块动态依赖于原版纹理。https://pic.imgdb.cn/item/65ed7a9e9f345e8d03691ad5.jpg
就这样,我花了一上午时间,就把无框玻璃做好了。我暂时不打算把它单独发成一个附加包,毕竟还没有做好染色玻璃——其实最主要的原因⑭是玻璃板,它的复杂程度比玻璃方块高出不少,而且有一个致命问题。我要用注释功能写一个备注⑮。
①〔久到我记不清时间〕大概是2021年10月16日15时18分46秒。
②〔“玩家周围都会变成玻璃”的生存地图〕那个地图好像还有个彩蛋,是地图文件里的彩蛋,游玩时不会被发现。地图还用了一种我当时看不懂的技术来把玩家周围一定范围内的所有非空气方块替换为玻璃。
③〔我当时写的manifest.json文件〕当时我使用4个空格作为缩进,这在添补附加包的早期版本中有所体现。后来我使用2个空格作为缩进,现在我使用等宽的制表符(\t)作为缩进。现在的添补附加包中都是这种缩进。
④〔几乎是不透明〕并不是完全不透明。
⑤〔不能用〕其实下载到了Java版修改包(Modifications)。
⑥〔2022年5月〕准确地说,是2022年05月29日18时42分40秒。
⑦〔一个示例〕这个示例使用了blend渲染方法。
⑧〔1.0.0版本〕这个版本的发布时间是2022年08月29日13时59分35秒。
⑨〔方块排列数量〕一个方块的每个方块状态数量的乘积。例如有3个布尔值状态,方块排列就是2*2*2=8。又例如有一个布尔值状态,一个3选项的文本状态,一个0-7的整型状态,方块排列就是2*3*8=48。
⑩〔在跑操时〕其实也包含所有跑步的时间。
⑪〔使用了6个布尔值〕因为骨骼可见性的Molang上下文不包含方块位置数据等,所以只能用方块状态来间接获取位置数据。
⑫〔会把方块排列数量降到0〕由于方块剔除自带检测周围方块的功能,使用这个功能后,无需定义方块状态,自然没有方块排列数量。
⑬〔X轴〕这里指东面和西面。
⑭〔最主要的原因〕好多人都做过这个了,以我这水平,感觉还没必要发……
⑮〔备注〕这些注释的序号都是字符。我的输入法只能打出来①到⑨,剩余的序号是我在UnicodePad里找到的,看起来它们的码位是从⑨开始向后依次排列。我先把这些序号放在这里,供日后需要:①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳。我还发现了一些其他序号,码位相近,可以去UnicodePad里看看。
页: [1]