前往
大廳
主題

更滑順的進度條

| 2025-03-16 03:02:28 | 巴幣 1012 | 人氣 34

core shader黑魔法
從上次這篇衍生的東西,這次改用資源包繪製數值之間的變化,所以不會有20tps的漫畫限制

文字元件的color還停留在古代的字串RGB,所以這次採用shadow_color傳送編碼
上面的測試傳了2 bytes的資料,綠色傳遞整條扣光所需的時間(tick),藍色傳遞動畫開始時的遊戲時間(tick, mod 240)
shadow_color傳遞的上限是4 bytes,其中透明度有不能為0的限制,所以應該會用來傳遞動畫時長,這次沒傳滿4 bytes所以我沒這樣弄

VSH - actionbar文字(Z=2200.03):
gl_Position設定成vec4(2, 2, 2, 1),也就是把沒用的文字本體排除到畫面外

VSH - actionbar陰影(Z=2200):
文字陰影自帶往右下各2像素的位移,所以要往左上搬回去
gl_Position的XY位移量是-2. / ScreenSize.x * guiScale2. / ScreenSize.y * guiScale
guiScaleround(ScreenSize.x * ProjMat[0][0] / 2.)
另外要把編碼的顏色還原掉,避免真的把奇怪的顏色畫上去
進度用GameTime和顏色傳入的初始時間計算,因為GameTime循環一圈是24000 tick,所以和初始時間比較的數值是fract(GameTime * 100.)
利用頂點之間插值的特性,傳遞relativeX變數給FSH:
if(gl_VertexID % 4 >= 2) relativeX = 1.;
else relativeX = 0.;

FSH:
拿VSH算出來的進度和relativeX比大小,relativeX大於進度時用discard;敘述捨棄像素

終究還是踏進濫用core shader的領域了
Cartocraft 2沒用到這招,灰羊毛區的進度條都是上一代的20tps指令顯示

喔然後希望Mojang能在1.21.5發布前把Intel內顯的bug搞定,現在這個測試在Intel內顯上跑會爆炸

創作回應

更多創作