如何在 Minecraft 中加入元素視野效果(二)

五、游戲處理
上一章中,我們實(shí)現(xiàn)了一個(gè)簡單的光影,它可以將畫面上的紅色與藍(lán)色互換。而為了實(shí)現(xiàn)這一效果,我們需要獲取當(dāng)前位置的顏色,并將顏色的 r 與 b 屬性調(diào)換位置。
在 Minecraft?運(yùn)行中,首先會(huì)在世界中生成大量的事物,其中有方塊、動(dòng)物、水流,玩家、甚至是天空,游戲程序決定了這些事物在世界中的位置、狀態(tài)、是否可見等等。
除此之外,我們還需要讓玩家進(jìn)入此世界中,為此我們還應(yīng)該將玩家的模型添加到世界。值得一提的是,在游戲編程中,為了讓玩家看到畫面,除了擁有模型以外,還需要一個(gè)攝像機(jī),它將充當(dāng)玩家的眼睛,用于作為觀察世界的起點(diǎn),通過設(shè)置攝像機(jī)的屬性,來決定畫面需要渲染哪些東西。
幸運(yùn)的是,以上都已經(jīng)由 Minecraft 實(shí)現(xiàn),我們只需要關(guān)注其中畫面的渲染。當(dāng)游戲?qū)⑹澜缣幚砗靡院螅螒虻膱D像數(shù)據(jù)將發(fā)送至顯卡做進(jìn)一步處理。
六、圖形處理
當(dāng)游戲處理完它負(fù)責(zé)的部分后,圖形數(shù)據(jù)將發(fā)送至顯卡。而在顯卡中指揮工作的正是光影中包含的許多著色器程序。但是并不是全部,事實(shí)上還有某些預(yù)處理以及后處理工作已經(jīng)由游戲引擎提供,我們需要編寫的著色器僅僅是在過程之間的一個(gè)小步驟。
最終到達(dá)我們的第一個(gè)著色器(vsh)中的數(shù)據(jù)包含整個(gè)畫面顏色的當(dāng)前位置,另一個(gè)(fsh)則包含整個(gè)畫面的顏色值。為了將每一個(gè)畫面顏色都照顧到,這兩個(gè)著色器將依次為每個(gè)顏色都運(yùn)行一次。
在每次運(yùn)行的過程中,我們可以簡單取到當(dāng)前處理所需的相關(guān)屬性,比如從 gl_MultiTexCoord0?緩沖區(qū)中取當(dāng)前顏色所在的坐標(biāo) xy,或者從?gcolor?緩沖區(qū)中取指定坐標(biāo)位置的顏色。
當(dāng)然,這里的坐標(biāo)不是指游戲坐標(biāo),而是顏色在畫面上的坐標(biāo),比如 (0, 0) 代表畫面的左下角。

七、濾鏡
在原神中開啟元素視野時(shí),畫面將被加上一個(gè)特定的綠色濾鏡,此時(shí)畫面將變成偏暗的藍(lán)綠色,并且有一條亮色帶從玩家的位置開始一直移動(dòng)至遠(yuǎn)方。這里我們可以把亮色帶放一邊,先試著將畫面調(diào)成偏暗的藍(lán)綠色。

對畫面進(jìn)行取色(不包括亮色帶部分)可以大致得出,濾鏡讓紅色取值大概在 [0, 45] 區(qū)間,由于顏色最大值為 255 ,簡單起見,我們可以認(rèn)為紅色被對應(yīng)縮放到 1/5,而其他兩種顏色則是 1/2。

在著色器中的主函數(shù)加入代碼,對相應(yīng)顏色進(jìn)行計(jì)算。由于 Minecraft 中的基礎(chǔ)亮度與原神中有些許不同,我們可以對這個(gè)比值進(jìn)行少許調(diào)整,將綠藍(lán)的比值改為 7/10,以提高亮度,還原色彩差異。
如果你有足夠的耐心,也可以一次一次修改,或者直接使用一個(gè)函數(shù)表達(dá)式,對色彩進(jìn)行微調(diào),以達(dá)到高度還原的效果。
