[新坑預告] Yet another shadersmod implementation

最近閉(zhuang)關(si)了幾個月,我並沒有被Hello Games幹掉(順便在這裡祝賀他們沒有跑路而堅持在Steam黑五打折期間出了個主要更新,以及敢於向玩家們彈小窗的勇氣 - 他們是我見過的第二個向玩家彈窗發送更新通知的遊戲廠商,第一個是製作MachineCraft的G2CREW) 這4個月我基本都在過着6點睡2點起(嗯,早晨6點,下午2點)每天見不到幾個小時的太陽的生活,在肝膩了文明V(沒有I)、艦R、崩3、WT後我終於決定該寫點什麼,正好手頭這個秘密開發了5個月的坑終於有些眉目了,因此決定放個預(wei)告(xing),有人說把坑公開出來就能督促自己不棄坑,然而對我這樣的臉皮略厚的人來說好像並沒有什麼用...2014年我公布了AsmEventBus(基於ASM的Java事件總線系統,比Guava那個基於反射的系統要快很多)和一個沒公開名字的Java模塊系統(如果稱它是"類OSGI"顯然有些裝逼,但它做的事確實和OSGI差不多) 然後理所當然地坑了,其實對於前者我挺耿耿於懷的,明明只要再完善一點就是個很好的庫...今年年初在日狗的軟工作業要求下不得不放了個某文字H遊戲引擎的Java開源復刻衛星,然後,嗯,然後沒下文了.寫到這時我自己都忍不住掩面笑了一下,看來羞恥柱這種東西對我這樣倒錯的人來說並沒有什麼監督作用.其實我挺懷念11~12年的那段時光,那段不知失敗為何物敢於寫任何自己想寫的代碼的日子,在11年的最後一個月我在這個房間的同一個角落半生不熟地用C#寫一個文字獵奇遊戲,用慢的吔翔的GDI+在WinForm上畫文字(現在一想其實挺像ERA啊,當時我要知道ERA的存在的話是不是就給ERA寫腳本去了?) 最吃精(?)的是當時我居然在試圖寫一個自己設計的腳本語言的解析器,幸好當時沒做出來,不然這足以讓現在的我感到自愧不如,有人說好的程序員應當在看到自己6個月以前寫的代碼時能發覺自己現在的進步,這麼說我應該儘快刪IDE退圈了. (笑) 不過我倒真的挺懷念那個項目,畢竟能親手(即使是只有文字)肢解幻想鄉的女孩子怎麼想也是一件刺激又有趣的事情,有機會的話我一定要把它復刻出來. (啊呸)

懷古傷今的時間到此為止了,現在說說手頭上這個坑,當時提出做MC光影Mod的復刻這個概念是在什麼時候已經無從考證了,印象中是14年7月我和ici2cc給CustomSteve做光影Mod兼容時第一次提出了自己做光影的想法,不過當時由於很"容易"地完成了CS與光影的兼容工作,因此這個念頭就被打消了.一年半後的16年2月我寫完了光影包教程後和ici侃大山時聊到了光影Mod的種種不足,當時我開玩笑地提出自己也打算寫一個光影Mod,ici沉默半響後問道你是認真的嗎,這時我才開始真正考慮這件事,具體的討論過程記不清了,結論大概是坑太大填不起,而且當時我剛完稿光影Mod教程很累,也並不想就這麼立刻廢掉自己的工作成果,更重要的是我想去填一個自己之前挖出來的大坑(這個坑不想提了...也不用猜,"基本上"從未公布過) 因此這件事就被放下了,時間到了6月,那時不知在哪我看到了一個消息,Continuum光影包的作者在用C++給MC寫一個渲染器,不用說也知道它會支持第三方光影包,當時就把正在補伊里野的天空的我嚇得把播放器關了,為什麼呢,因為當初我被Continuum的作者肛過一次(大霧) 2月初我在撰寫光影包教程的最後兩章時ici彈小窗告訴我"被搶先了",當時嚇得我差點提前去見幽幽子,ici趕在我失神之前發來條鏈接,我趕緊緩過來點開一看是個油土鱉視頻列表,上面三四片Continuum的作者錄製的光影包教程視頻,簡單地看了一下後我半自我安慰地得出了個結論:(局座臉)這教程,飛不起來! 本着公平競爭的原則,這裡貼出視頻列表地址,為什麼那麼說呢,我感覺他過度死扣光照、ToneMapping和PBR,而忽略了對光影Mod特性的介紹,最簡單的例子,除了我的那篇附錄以外還能從哪找到對光影Mod的技術規範文檔呢,恐怕官方Wiki都沒有這麼詳細,然而話是這麼說,但畢竟人家已經搶先發出來了,"第一個光影Mod教程"這個頭銜是搶不到了,只好奮筆疾書去搶"第一個成文的光影Mod教程" (笑) 這也是為什麼我的教程中最後兩章明顯的很潦草的原因 (當然,我寫煩了也是一個原因...) 後來我的教程發出來了,而他的教程棄坑了,我還順手打了兩發對他的黑槍 (誒嘿,我這人咋就這麼愛打黑槍呢) 一個是他那個"號稱世界最強卻實際只是又一個C13衍生品的光影包",一個是他開的"MC的Vulkan渲染器"坑.故事就看似告一段落了,然而我萬萬沒想到的是他那個Vulkan渲染器在知難而退後又蛻變成了"C++寫的OpenGL4.5渲染器",然後又把我肛了一次!被一個人肛兩次這事能忍嗎!

然而當時是考試周,我只能忍下去了 (笑) 考試結束後我開始探究技術可行性(後來證明這幾乎是無用的,所有遇到的問題這時都沒發現) 並於7月的實習第一天在那間位於商住一體樓里的破房子中建了項目的Git倉庫,版本記錄顯示前三天我寫的代碼除了Mod主類和Coremod的LoadingPlugin以外沒有一行保留到了現在 (手動滑稽) 一方面說明了那個"百分之多少(記不清了)的代碼是要在一年內被重構掉"的理論是正確的,另一方面說明了當時我是有多麼低估了問題,雖然那次糟糕的實習讓我失去了去CJ和Jeb見面(對此ici可以吹一輩子(笑))以及勾搭上養豬場的機會並且錯過了魔都THO,但如果說那一個月實習有什麼用的話,那就是讓我塌下心能用當初徒手肝解析器的勁頭從零製作"Yet another shadersmod implementation",不,它不叫"Yasi"或什麼的(雖然現在看起來還挺酷!) 也不叫ShaderCraft云云,我將其命名為OpenShader,因為Open這個詞對於開源程序員來說就如同貓薄荷對貓一樣充滿魅力,顯然這是開源的,不過我將它暫時託管到了私有倉庫中,因為當初我也實在不敢確定它可以完成,畢竟我之前失敗過的太多了,事實上,直到11月初時它甚至還沒法正常運行,而我最初的計劃是10月初給出一個Demo...當初我寫光影包教程時也曾"計劃"在10月初完稿,不過現在看來這次我似乎不必拖到次年2月了,然而Mod維護是一件長期的工作,不是嗎?主要的技術突破都是在11月中完成的,現在它已經實現了:

  • 高度自定義的渲染管線,可自定義每一幀(Frame)渲染時採用的Pass,以及每一Pass包含哪些繪製階段(Stage)
  • 着色器加載系統,包含一個簡單的Includer實現(無需那個ARB擴展).
  • 可自定義的幀緩衝和幀緩衝的掛件(顏色、深度、模板),包括掛件的尺寸和格式.
  • 頂點着色器的頂點屬性(Attribute)注入.
  • 一致變量(Uniform)注入.
  • 優化的GlStateManager,儘可能地減少OpenGL調用.
  • 特性(Feature)系統,用於開啟、關閉或改變一些MC的功能與屬性,比如設置太陽偏斜(光影Mod的sunAngle)
  • 使用VAO渲染區塊 (WOW!) 理論上講90%+的顯卡都支持ARB_vertex_array_object和APPLE_vertex_array_object中的一個,如果有哪個辣雞卡兩個都不支持,那它也不見得跑得動着色器.
  • 支持Mod式和外部文件式的光影包(其實只實現了前者)

當然,它還有一個不短的TODO List,由於沒有寫TODO List的習慣(??)這裡先隨手寫上一些能想到的:

  • 紋理系統,比如光影Mod的載入法線和高光紋理,以及載入外部紋理文件,可以搞基於LUT的顏色校正啦.
  • 用戶界面.
  • 外部文件式的光影包的解析.
  • 資源管理...
  • 條件允許時使用UBO更新一致變量.
  • 世界上有兩群人需要人間會社程序員的人間關懷:烏干達的可憐兒童,和蘋果機用戶.
  • 還有一些瘋狂的念頭,不過都是要在前面這些完成的前提下才有...
  • 大量的,關於紫sama藍sama幽幽sama覺sama戀sama秦心醬和瑪艾露貝莉x蓮子的福利

想說的暫時是這麼多,如果成了的話喜大普奔,再一次棄坑了的話那就又是一次喜聞樂見的自掛城牆,我先睡覺(jue)去了...這裡貼一個Mod式光影包的光影包初始化代碼和渲染管線構建代碼的一部分 (群眾:有毛用啊!) 可以大概了解一下它的API風格,畢竟將來有了外部配置文件式的光影包後,基本上也會跟它差不多:

53057998_p0

不好意思,貼錯了...

20161203071732

20161203065401

這個才對 √