寫在《如何編寫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都已經選擇開源了,技術門檻註定了小引擎在市場上沒有生存能力,但擁有底層開發能力的人卻不會消失,聚攏這些"免費的勞動力"為自己的產品貢獻生產力顯然是一筆划算的生意,今後,專屬引擎恐怕只有專業的公司才有能力維護和開發,獨立開發者或小團隊面臨的選擇只有幾款泛用引擎,從某種角度說,這倒也是一種進步,開發者可以將自己的精力專註於實現最關鍵的代碼,而不用重複製造一支支良莠不齊的輪子.

想說的就這麼多了,還要複習補考啊 ? 本文沒有想表達什麼思想,只是一番吐槽、黑槍、和對過去半年受難的總結.