BlockOS開發(fā)日志(番外一)實(shí)現(xiàn)準(zhǔn)星
做地形生成算法好累哦,來(lái)點(diǎn)休閑的UI時(shí)間233。
作為一款開放世界沙盒游戲,玩家所處的環(huán)境必然是多種多樣的??赡芮耙幻朐谘┑?,后一秒就到洞穴里去了。準(zhǔn)星也是有顏色的,如果是白準(zhǔn)星,可能在雪地里看不清;黑準(zhǔn)星到洞穴里又看不清。要如何保證玩家何時(shí)何地都能看清準(zhǔn)星之類的UI呢?(當(dāng)然是摸著別的游戲過(guò)河
于是我找了找手頭上幾款有準(zhǔn)星的游戲,看看它們是如何實(shí)現(xiàn)準(zhǔn)星的。



可以看到原神和Apex都是給對(duì)應(yīng)的準(zhǔn)星加上一個(gè)輪廓,而Minecraft則是用到了一個(gè)似乎是反色的效果。
那就,做兩個(gè)版本好了(

嗯,準(zhǔn)星首先要有十字準(zhǔn)星。為了表示挖掘方塊或者是為物品充能,還可以加個(gè)進(jìn)度條。然后我覺(jué)得fps游戲里能看方向很酷,所以加了方向指示器。。。emmm最后做出來(lái)是這個(gè)樣子的:

這邊方向指示器的實(shí)現(xiàn)是把方向向量的x,z分量映射到'N'圖片位置的-x,y上,y映射到'N'圖片的alpha值和縮放值實(shí)現(xiàn)的。所以有這樣的情況:


感覺(jué)做的還是很有趣的hhh,至少我自己很滿意。硬要說(shuō)問(wèn)題的話,就是很有可能讓玩家把注意力都集中到準(zhǔn)星上了吧。說(shuō)完了自定義控件,下面說(shuō)說(shuō)它們這些特效的實(shí)現(xiàn)。

首先明確實(shí)現(xiàn)特效的需求:讓準(zhǔn)星能夠在任何環(huán)境下被玩家看清。在先前的參考中,已經(jīng)知道了有兩種方案可行。一種是加描邊的方案,一種是讓顯示的內(nèi)容反色的方案。
第一種方案在Unity上實(shí)現(xiàn)很簡(jiǎn)單,直接加上Outline組件就好了。實(shí)現(xiàn)方法一個(gè)是在片段著色器上做上下左右采樣判斷當(dāng)前片段是否處在邊緣外圍,如果是就輸出描邊顏色。而Unity的Outline的組件應(yīng)該是創(chuàng)建了4份網(wǎng)格涂黑然后做一定方向的偏移實(shí)現(xiàn)的。

用著色器實(shí)現(xiàn)描邊好處是三角數(shù)少,但是會(huì)遇到描邊可能超出面的范圍的問(wèn)題。Outline的實(shí)現(xiàn)直接讓三角面的數(shù)量翻了4倍,但是視覺(jué)效果還是很不錯(cuò)的。
第二種方案就必須得上著色器了。對(duì)于我這個(gè)只能說(shuō)了解TA的人來(lái)說(shuō),我第一個(gè)瞬間想到的是用后處理+模版緩沖來(lái)做= =。
后面找了好久資料才意識(shí)到可以用顏色混合來(lái)做,除了用顏色混合來(lái)做透明外,它是可以自定義計(jì)算公式的,因此可以讓輸出的顏色減去顏色緩沖的顏色來(lái)實(shí)現(xiàn)反色。
然后簡(jiǎn)單丟掉alpha過(guò)小的像素,就實(shí)現(xiàn)了下面的效果:

但是另一個(gè)問(wèn)題出現(xiàn)了:因?yàn)檎加昧送该餍枰念伾旌希酝该鞑黄鹦Я?。不過(guò)我的游戲經(jīng)驗(yàn)告訴我可以把模型的一部分片段丟掉變成一個(gè)個(gè)散開的點(diǎn)來(lái)實(shí)現(xiàn)透明。查了一下這個(gè)技術(shù)叫做Screen Door Transparency。然后簡(jiǎn)單復(fù)制了下實(shí)現(xiàn),把透明用這種方式解決了。

所以我一天就做了個(gè)準(zhǔn)星??。?/p>
參考
https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/03%20Blending/
https://www.jianshu.com/p/c68a730e9a8b
https://digitalrune.github.io/DigitalRune-Documentation/html/fa431d48-b457-4c70-a590-d44b0840ab1e.htm