Particle Bloom粒子輝光解析-適合新人學(xué)習(xí)的實(shí)用著色器
(本教程使用了完全沒有著色器經(jīng)驗(yàn)的視角編寫,提供了一種拆包的方法)
之前我在逛mcbbs時(shí)發(fā)現(xiàn)了一款很神奇的資源包,這里附上效果圖和原貼:https://www.mcbbs.net/thread-1210511-1-1.html



Particle Bloom著色器對(duì)游戲做了哪些影響?
最簡(jiǎn)單的辦法當(dāng)然是找原作者
?

Hmmmm…
看來要知道這個(gè)著色器的原理,只能拆包了
?
乍一看文件很多,很復(fù)雜,但仔細(xì)閱讀就能發(fā)現(xiàn):
這個(gè)著色器只修改了2個(gè)核心著色器,一個(gè)后處理著色器,添加了一堆著色器程序
那么下一步就是要理清著色器工作的順序:
在我的著色器基礎(chǔ)教程中講過,游戲使用核心著色器渲染之后交給后處理著色器,后處理著色器對(duì)已經(jīng)渲染完畢的緩沖進(jìn)行更改再移交到用戶屏幕上。
Step1:
檢查核心著色器修改了什么東西
?

如果對(duì)原版代碼不熟悉建議雙開,上面是Particle Bloom的內(nèi)容,下面是從版本jar文件中提取的著色器。
?

檢查后發(fā)現(xiàn),著色器中只對(duì)particle.vsh的這行做了修改。
?

我們可以先把其他的著色器占時(shí)放到不被游戲識(shí)別的任意文件夾內(nèi)。(因?yàn)橹魑募g的關(guān)聯(lián)很大,沒有修改的文件一般是為了防止出現(xiàn)兼容問題,這里只是解析著色器所以可以忽略)
?
這個(gè)如果你不知道vertexColor是什么,我們可以在其他大多數(shù)的片段著色器中找到它(這個(gè)變量由頂點(diǎn)著色器傳遞給片段著色器運(yùn)算)
?
把它去掉之后:
?

?

可以說:這個(gè)變量控制了畫面的光影變化和colormap的著色效果。當(dāng)然也控制著粒子的著色效果。那么去掉的texelFetch(Sampler2, UV2 / 16, 0)到底有什么效果呢?
我們不妨把它加回去試試
?

好像變暗了一些?旁邊的末影龍火球粒子也幾乎看不清了。
很可能這個(gè)參數(shù)就是控制著粒子隨著環(huán)境的明暗變化,事實(shí)上也的確如此,作為同時(shí)控制粒子著色效果和明暗變化的變量,如果只剩從材質(zhì)中采樣出來的顏色,自然就只保留了著色效果,去除了明暗變化,讓粒子以原始亮度渲染。這對(duì)于粒子的輝光效果處理顯然是必須的,否則會(huì)讓這個(gè)效果看起來很怪(粒子明明很暗但是還是會(huì)發(fā)光)。
處理1:在vertexColor中刪除了texelFetch采樣讓粒子以原始亮度渲染
下一步,將渲染完成后的畫面交給后處理著色器(也就是下圖的畫面)
?

查看后處理著色器,發(fā)現(xiàn)修改了用戶在極佳畫面質(zhì)量下使用的后處理著色器
檢查了一遍文件,發(fā)現(xiàn)了一大堆沒有啟用的程序
?

排除這些干擾后,再次檢查內(nèi)容:
?
在targets中添加了”removegreen”,”swap”,”green”,”green_h”,”green_v”,”target_particle”幾個(gè)緩沖。
?
調(diào)用了4次makebloom程序,每次都傳入兩份同樣的緩沖,一份由intarget傳入,系統(tǒng)標(biāo)記為DiffuseSampler,另一份由auxtargets傳入,標(biāo)記為GreenSampler,提供的參數(shù)Power的值分別為1.0,2.0,4.0,8.0。
處理2:將覆蓋前將particles緩沖模糊化,做到輝光效果
makebloom的內(nèi)容不再具體分析,簡(jiǎn)單來說就是通過數(shù)學(xué)運(yùn)算將只有粒子效果的一個(gè)渲染層變成光暈(或者可以理解為變糊了?),“變糊”的方式有很多種,可以自行更改。
再將“變糊的”green緩沖和游戲內(nèi)容final緩沖在fade程序中疊加在一起。
最后在back中將重新被游戲渲染的粒子和之前的緩沖再次疊加,輸出到minecraft:main中
處理3:將模糊的輝光疊加到游戲內(nèi)容上
(該資源包的使用的后處理頂點(diǎn)著色器程序都是對(duì)內(nèi)容沒有任何影響的系統(tǒng)著色器)
?
對(duì)原理進(jìn)行了分析后,我們可以對(duì)以下現(xiàn)象做出解釋:
作者未對(duì)粒子做出篩選,但黑色的粒子并沒有輝光效果:
黑色的粒子變糊之后會(huì)和沒有粒子的背景部分處理成一個(gè)顏色,在fade中組合的時(shí)候會(huì)被當(dāng)成沒有粒子的情況,所以不會(huì)有輝光效果。
?
以及一些優(yōu)化的方式:
檢查UV2對(duì)一些不應(yīng)該發(fā)光的粒子不做模糊處理
使用采樣器對(duì)一些較暗的粒子進(jìn)行模糊程度的修改