写在《如何编写Shadersmod光影包》截稿之后

20160217032142

时间是早上6点30分.第一缕阳光透过天际线,将天空重新染回了深蓝色,宣告着一天生活的开始,而在此之前,这个城市第一批工作的人早已忙碌起来,楼下传来电动车轻微的嗡嗡声,如果那位送奶工稍有留意的话,一定会注意到在这个尚未醒来的社区中,总有一栋楼的一扇窗是通宵长明的,当一个人在沉睡的世界中醒来时,难免会对周围为数不多的同样清醒的人产生好奇,那间房间的住户在他眼中会是什么样的人?一个沉迷于电子游戏通宵达旦的少年?一个在半睡半醒中着衣准备扎入地下,沿着一条隧道前往城市的另一头上班的青年?还是一个见证了共和国的诞生与成长,在结束了自己几十年如一日的工作后,正在安享另一个十年如一日的生活的老(zhang)者(?)?又或是仅仅不经意地瞥一眼后便调整车头一甩而过,毕竟这个城市太大,而值得留意的人又太少.

对于房间的主人来说也是一样的道理,在被车声分心了眨眼的工夫后,便又重新将注意力集中在眼前的屏幕上,灰色背景的网页中,密密麻麻的象形文字平铺在纯白的框体中,对一个英语国家的人来说,这种文字几乎是不可思议的,难以想象这些远古的黑暗时代的涂鸦能伴随着文明一路成长延续至今,并深深地渗透入它的文化当中,而对信息学家而言,这种表述方式并无任何值得惊讶的地方,在卐字旗已经从国会大厦前降下而铁幕与高墙尚未筑起的时代,香农已经指出了信息的本质,世间万物,但凡实际存在可被度量者,皆可被表示为比特,原本无意义的涂抹被有机地组合后构成了文字,而数以万计意义不明的文字在被精心地排列后,构成了眼前的这一篇文章,在另一处看不见的地方,数以千万计的比特正以电或磁的形式存储在介质中,当它们以合适的形式显示出来时,在屏幕上就是一张张美轮美奂的截图或简洁而巧妙的图示.这些内容加起来不及一亿比特,倘若只是单纯地产生它们,在计算机中只需微秒计的时间,但要将他们排列成有意义的形态,却需要数以月记的时间.在安慰性地扫视了几眼后,鼠标指针停在发布按钮上,已经没有什么可等待的了.

好吧,实际上故事并没有这么浪漫,当时我心里想的是"我TM可算是解放了!",然而事实上,我心里也很清楚,它的发布只是一个开始,至少是另一件事的开始,对一件作品的维护几乎和创造它一样重要,这也是我总是对Forge教程的未更新完结感到一种负罪感的原因(哦,当然还有那些被我放置play的读者?),然而不幸的是,维护工作永远不比创新工作要光鲜,我想到了王垠在嘲讽Scala时说的故事(虽然不知道是真是假):"每当Martin Odersky的学生需要毕业时,就会给Scala添加一个很玄乎的新功能,然后以此撰一篇论文,而一旦毕业之后便弃之不管拍屁股走人了",看来维护真是一件谁都不喜欢的工作啊 ?

对于写作,怎么说呢,也许跟我写的类型有关(毕竟需要斟酌字句和查阅资料),我一直没感觉到什么写作的快感 ? 我只是比较喜欢把自己知道的东西写出来(我也想把自己脑洞大开想到的猎奇小剧场画出来啊但是底力不够?) 说起来也蛮奇怪的,Shadersmod连个像样的教程都没有,那之前那些人是怎么做出光影包的呢,难道有一个潜伏在IRC或暗网网站上的光影俱乐部吗?我跟ici2cc聊起这个问题后他告诉我Sonic Ether本人其实参与过Shadersmod的开发,而Chocapic13...或许也是一位独自把Shadersmod吃透了的人,他虽然没有选择著成一份教程,但却以一个极宽松的许可将他的光影包开放给大众修改,于是便有了雨后春笋般的Chocapic13系光影包 ? 除SEUS和Chocapic13的光影包以外的原创视觉系光影包我也见过(至于功能性的,我见过有一个很猎奇的球面效果的光影包和地形会波动的光影包...超魔性),比如"RudoPlays Shader",效果嘛... ? 不管怎么说,现在光影包市场已经饱和了,SEUS作为标杆级的几乎力压群雄,然而对于后来者想战胜这个歌利亚也不是不可能,SEUS和Chocapic13的光影包都包含了大量的冗余代码,如果你有足够的技术的话,完全可以开发出拥有更好的效果和更快的效率的光影包.当然,我们学图形学又不是为了吊死在Minecraft光影这一巴掌大的地方,就像Sonic Ether平时也是在写U3D着色器的嘛,虽然在文中有很多部分是在解决光影包中的问题,但仍有相当一部分是从原理上阐述一项功能该怎样实现,而且即使是针对光影包问题的部分,你在别的游戏或程序中实现相关功能时也很可能遇到,比如ShadowMapping时的各种Peter Pan之类的.

再说到编程,其实以前我在失眠时想过一些无聊的问题,比如编程的本质,理论上一个源源不断地随机输出字符串的程序,或者是一群永不疲倦地敲打打字机的猴子,在一个有限的时间内总能恰好输出一段有意义的,可以被编译或解释的代码,这么说的话你只要连上一台服务器的19端口,就可以坐等它为你输出一段程序了,然而实际上即使只是输出一个"Hello World"的程序也可能需要你等待难以计量的时间,具体取决于你使用的语言,如果是HQ9+的话大概可以瞬间获得结果,但如果是Java的话恐怕要等待相当一段长的时间,而且这还是建立在验证代码可以被瞬间完成的情况下.如果引入熵的话,一个完美的随机数生成器产生的字符序列的熵应该是接近它的系统中的最大值,相比之下,由人类编写的可运行的程序的熵即使不是最小,也会是一个高度有序的较小值,如此解释的话,编程的过程,似乎就是以工作者熵增为代价让代码熵减的过程,然而一行空格远比一行代码要"有序",但后者却要比前者更有意义,或许这里的熵应该是用信息论的定义,以表达讯息的不确定度来衡量熵,如此说的话,一条含义明确的代码的熵即比一行无规律的乱码要低,也比一行无意义的空格要低,这样看来就合理多了. (当然,如果你真的想靠一个机器随机生成代码来写程序的话,或许考虑用马尔可夫链以不等概率随机生成抽象语法树更有可能获得一个可执行的程序 ☺ 虽然这种方法本身就很蠢)

之前评论里提到过"写到vulkan1.0都发布了",也确实是这样?,昨天收到Nvidia发的邮件(我纳闷了半天我怎么被老黄钦点了,后来才想起来是当初为了下Nsight而注册了个账号),还真没想到这个项目进展这么神速(想必是出自DX12和Metal的压力?),去年的这时候还是叫glNext,甚至都尚未改名叫Valkan,AMD的Mantle也还没从容就义,而现如今便已经发布了1.0规范了,现在在Github上已经可以搜索到近百个和Vulkan有关的项目,其中有个有意思的是vulkan-mod,没错,就是把Minecraft的渲染器从OpenGL魔改成Vulkan,这意味着我要失业了吗(笑)  (这里悄悄打个黑枪,一是我觉得除非他把整个MC的渲染系统魔改了,不然用Vulkan会只慢不快,Vulkan的优势是多线程渲染,如果不用到这点的话,它那一层OpenGL到Vulkan的封装,再加上NA两家的Vulkan驱动成熟度尚不及OpenGL,怎么快的了呢.?黑枪之二:怎么还有第二枪了?他也在写,至少是参与在写一个光影包,介绍的后半句不错,"make the best shader minecraft has ever seen",而前半句"a complete rebuild of Sonic Ethers code",呃...?)

在这个技术日新月异的时代,想跟上发展的步调确实不容易,曾有多少个自制引擎的游戏疲于更新技术?大刀(虽然它是买的引擎)开了个坏头,然而它的沦为笑柄的结局却不能阻止精益求精的人陷入追赶技术的怪圈,还记得无限星辰,那个号称能随意进入大气层的太空游戏吗?八年前我看见他们的博文介绍如何编写大气层着色器,现在他们似乎还在重写这部分,而那些引以为傲的特性,已经悉数被其他游戏实现了.在为光影包教程查阅资料时我搜到了一个独立游戏:Epsylon 这是个11年前便开始开发的FPS游戏,游戏风格显然是仿DeusEx1的,教程关Demo中那个自动贩售机就是向DX1致敬?,这个制作小组确实相当厉害,从零搭建起了一个完善的引擎,文章区中有不少启发性的技术文章,然而这却改变不了他们是一个有着强力引擎却做不出强力游戏的团队,技术门槛的日益高涨终结了昔日为一款游戏打造一套专属引擎的时代,即使是卡马克也不得不承认"现在你可以花18个月制作一套引擎,也可以花18个月制作一款游戏,但你不可能花18个月制作一套引擎然后以它制作一款游戏",这也是为什么各种泛用性引擎崛起的原因,过去游戏引擎要么需要支付一笔不菲的授权费,要么是异常简陋,缺乏一套完整的工作流;最早掀起引擎亲民化的我想大概是各种"XXX制作大师",比如RPGMaker、GameMaker和Construct之类的,这些提供了完整的工作流的引擎确实可以圆不少人的游戏梦 ☺ 从本质上来说,U3D与UE和他们并没有什么不同,变化的只有越来越先进的技术和新的开发方式.而现在下一个趋势我想是引擎开源,事实上,Source和UE4都已经选择开源了,技术门槛注定了小引擎在市场上没有生存能力,但拥有底层开发能力的人却不会消失,聚拢这些"免费的劳动力"为自己的产品贡献生产力显然是一笔划算的生意,今后,专属引擎恐怕只有专业的公司才有能力维护和开发,独立开发者或小团队面临的选择只有几款泛用引擎,从某种角度说,这倒也是一种进步,开发者可以将自己的精力专注于实现最关键的代码,而不用重复制造一支支良莠不齐的轮子.

想说的就这么多了,还要复习补考啊 ? 本文没有想表达什么思想,只是一番吐槽、黑枪、和对过去半年受难的总结.