創作內容

5 GP

Unity特效(鉛筆素描特效 Pencil Sketch Effect)

作者:Adisa│2019-05-26 14:31:32│巴幣:10│人氣:595
參考此篇

這個專案是一種讓畫面看起來像是使用鉛筆素描的特效,它的原理簡單來說就是運用在畫素描時基本上有6種Hatching,根據wiki解釋Hatching是一種素描時藉由繪製緊密間格的平行線來表現出陰影的繪畫技術,以下就是6種Hatching。


藉由這方法來讓畫面呈現出像是素描的風格

以下為實際套用情形





以下來大致說一下作法
這個專案在原作者那最強調的是原本是要藉由6張hatching才能做到的效果,他可以打包成兩張hatching就做到



先解釋一下,在原本網站中的說明跟載下來後專案中的shader檔案有點不一樣的情況

原本網站中在
v2f vert(appdata v)
{
  o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
....
....
}
這段跟載下來後的HatchingComposite.shader
v2f vert(appdata v)
{
  o.vertex = UnityObjectToClipPos(v.vertex);
....
....
}
這兩者是一樣的東西,都是把原本的物件頂點藉由跟UNITY_MATRIX_MVP相乘來求得新的投影點座標,兩者間的差異在有沒有使用GPU Instancing這個功能,若有使用的話UnityObjectToClipPos(v.vertex)在運算上會優於前者。

在原本網站中v2f vert(appdata v)還有一段是HatchingComposite.shader所沒有的,
o.uv = v.uv * _MainTex_ST.xy + _MainTex_ST.zw,而這段被放到OutputUVs.shader中來處理。這段簡單來說就要把貼圖的Tiling跟offset要計入影響。



_MainTex_ST.xy代表Tiling, _MainTex_ST.zw代表offset。

以上就是差異,而不管是原文網站或是載下來的專案這個vert method就是去把模型的頂點、uv值求出並傳到frag中。

接下來在frag中去求得現在的光照強度
fixed4 col = tex2D(_MainTex, i.uv);
half intensity = dot(col.rgb, float3(0.2326, 0.7152, 0.0722));

intensity就是去計算出現在的光照強度,算法就是用現在的貼圖中所得到的color去跟一組常數向量做內積float3(0.2326, 0.7152, 0.0722)理由是根據亮度公式

接著就是重點,把這個光照強度去做hatching運算。

這裡方法就是去看看剛剛所求出的intensity是介於1到6個hatching哪種陰影強度下,比如說光照強度算出來是0.25,大約是1.5/6,介在1/6跟2/6之間,參考下圖

因此就要求出兩者間的內差值才能表現出。原文中有提到若是一般在處理這個情況時可以寫成
fixed3 rgb;
if (intensity > 1.0 && intensity < 2.0)
{
    fixed3 hatch = tex2D(hatch0, uv);
    rgb += hatch.r * (1.0 - intensity);
    rgb += hatch.g * intensity;
}
else if (intensity == 2.0)
{
    rgb = tex2D(hatch, uv).g;
}
else if ...
依照不同的光照強度來設定一系列的if條件來處理,但是這牽扯到GPU跟CPU最大差異設計,就是cpu在處理branch也就是for,if這些邏輯運算上優於GPU,GPU強的是ALU也就是算術運算。因此上面的寫法會讓GPU的耗能提高,不建議使用。

在本篇的情況中處理的方法是,計算權重,也就是說6個hatching圖對這個intensity影響權重,0是無影響,1是完全影響。

原文中所提到的計算方式
half i = 0.75 * 6; // 這個i也就是intensity是4.5/6,介在4/6跟5/6之間
half3 intensity3 = half3(i,i,i); //(4.5,4.5,4.5)

half3 weights0 = intensity3 - half3(0,1,2); //第一組跟0,1,2這3個hatching做減法運算出(4.5,3.1,2.5)

half3 weights1 = intensity3 - half3(3,4,5); //第二組跟4,5,6這3個hatching做減法運算出(1.5,0.5,-0.5)
這邊額外說明一下兩個權重運算代表前面提到的兩張貼圖,也就是說6張hatching中前面3張顏色較淺的hatching效果可以用這張貼圖算出(weights0 )
後面3個顏色較深的hatching可以用來計算。(weights1)

而他們算出的權重分別為(4.5,3.1,2.5),(1.5,0.5,-0.5)這兩組,問題來了,權重應該是介在0與1間,把這些數字直接計算會有問題,因此這邊再修改一下使用saturate()來重新mapping值到0與1之間,大於1的mapping到1,小於0的mapping到0,其他介在0與1的數字不變
half3 weights0 = saturate(intensity3 - half3(0,1,2));
// weights0 = (1,1,1)

half3 weights1 = saturate(intensity3 - half3(3,4,5));
//weights1 = (1,0.5,0)

但這邊依然有個問題要處理,前面說到只需要2個非零的權重來處理,但這邊有五個非零值,因此需要去掉權重低的hatching,留下剩下兩個數值,這兩著相加為1。以下為其算法
weights0.xy -= weights0.yz;
weights0.z -= weights1.x;
weights1.xy -= weights1.zy;
原文中作者沒明說為什麼要用這樣的計算,就我的理解是每個hatching都會受到比自己要深色的hatching影響,比如說以上面例子來看第一個hatching是1,但是第二個hatching也是1,因此雖然同時受到兩個hatching影響,但就在光影表現上,較深的第二個hatching影響會大於第一個,因此在這個邏輯下若較深的hatching權重是1的情形下前面較淺的hatching是0是1並不列入考慮,所以用這個互相減法的運算求出真正影響這個光照的hatching。

上面的intensity在0.75下最後所求得的兩組權重就是(0,0,0) 與(0.5, 0.5, 0.0)剛好就是第4個hatch跟第五個hatch各影響一半。
因此在最後求那兩張藍色線條貼圖的hatching權重,並做最後的顏色加法,就可以求出最後的hatching

hatch0 = hatch0 * weightsA;
hatch1 = hatch1 * weightsB;

half3 hatching = overbright + hatch0.r +
hatch0.g + hatch0.b +
hatch1.r + hatch1.g +
hatch1.b;

return hatching;

額外提一下
下載下來的專案有這一段
#if defined(UNITY_UV_STARTS_AT_TOP) && !defined(SHADER_API_MOBILE)
  o.uvFlipY.y = 1.0 - o.uv.y;
#endif
這段是指說若是在非定義的shader情境中要把uv值的y上下顛倒,但這應該是因為之前的unity的問題才有這段程式來讓uv值正常,但若用2017版後的unity使用這段,會造成畫面上整個貼圖顛倒,因此把這段直接刪掉或是註解掉即可。

接著還有一段程式

float4 uv = tex2D(_UVBuffer, i.uvFlipY);

這段在fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);

float4 uv = tex2D(_UVBuffer, i.uvFlipY);
....
...
}
這段程式碼是計算貼圖中受影響的部分,在PencilSketchPostEffect.cs中有一個功能是可以設定那些layer層(effectLayer)要受到這個素描特效的影響,他的方法就是設定一個camera他所能看到的layer層也就是effectLayer所指定的,接著把這個camera的renderTexture讀出後,設定給HatchingComposite中的_UVBuffer,最後在由Graphics.Blit()做最後的混合與呈現

fixed3 hatch =  Hatching(uv.xy *8, intensity);
這個就是把貼圖的uv與光照強度拿去給hatching運算,其中的8是可以依照個人喜好調整,數字越到線條越細,反之越粗。





引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4405630
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unity|unity|獨立遊戲|特效|shader|Pencil Sketch Effect

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

5喜歡★Adisa 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[輕小說] 赤瞳的伊莉雅... 後一篇:[輕小說] 赤瞳的伊莉雅...

追蹤私訊切換新版閱覽

作品資料夾

HuneHangLee大家
跟幾位同伴寫了篇詩,大家來看看吧!看更多我要大聲說昨天23:24


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】