這篇文章主要介紹了unity怎么實(shí)現(xiàn)半透明物體的描邊和投影的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇unity怎么實(shí)現(xiàn)半透明物體的描邊和投影文章都會有所收獲,下面我們一起來看看吧。
半透描邊大概就三種方案,1.按透明繪制但是寫入深度,2.用模板緩存代替深度,3.當(dāng)不透明物體渲染并用GrabPass來模擬透明。我這里用的是最簡單的第一種。
和頭發(fā)類似,先繪制背面,再繪制正面,然后再擴(kuò)邊繪制背面的描邊,3個PASS,需要保證模型的內(nèi)面的深度更高。封閉物體都具有這個性質(zhì)。
Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Front
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Back
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Cull Front
CGPROGRAM
#pragma vertex vert_line
#pragma fragment frag_line
ENDCG
}
用普通的透明shader和backface擴(kuò)邊替換vert,frag,vert_line,frag_line就可以得到這個效果,因?yàn)榫唧w實(shí)現(xiàn)各人的都不同,就不寫出來了。
會出現(xiàn)的瑕疵有:
1.兩個透明物體并交叉包含的時候會互相遮擋,而且當(dāng)透明排序變化的時候會跳變
透明物體的固有問題,沒什么好辦法,別讓這種情況出現(xiàn)就好。
2.粒子處于模型的前方,而且發(fā)射出的粒子進(jìn)入球內(nèi)的時候會被遮擋。而如果粒子處于模型后方,無論如何都不會被遮擋。
這其實(shí)也是半透明自己的問題。如果在意半透和非半透交叉產(chǎn)生的交線,可以開啟軟粒子回避(其實(shí)球和Cude的交線瑕疵也能這樣回避)
半透陰影其實(shí)可行的就網(wǎng)點(diǎn)這種,其他的諸如給shadowmap加透明通道,都需要額外增加成本,而且難以處理多層疊加的問題(兩層半透之間的物體的陰影接收也是需要處理的),真正完美的方案需要把shadowmap存UAV里實(shí)現(xiàn)多層shadowmap(還要帶透明度),這可算了吧。
網(wǎng)點(diǎn)半透需要修改ShadowCast,做法是給原Shader增加一個LightMode標(biāo)記為ShadowCaster的Pass,并重新定義繪制邏輯。
Pass{
Tags {"LightMode" = "ShadowCaster"}
Cull Off
CGPROGRAM
#pragma vertex vert_shadow
#pragma fragment frag_shadow
#pragma multi_compile_shadowcaster
ENDCG
}
繪制陰影的時候需要根據(jù)原圖的透明度,輸出下圖這樣的網(wǎng)點(diǎn)圖案來模擬透明效果(為了方便觀察故意把網(wǎng)點(diǎn)放大了)
網(wǎng)點(diǎn)的生成沒有使用網(wǎng)點(diǎn)紋理,而使用了一個數(shù)值計(jì)算的結(jié)果:
void transparencyClip(float alpha, float2 screenPos)
{
// Screen-door transparency: Discard pixel if below threshold.
float4x4 thresholdMatrix =
{ 1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0,
13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0,
4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0,
16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0
};
float4x4 _RowAccess = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
clip(alpha - thresholdMatrix[fmod(screenPos.x, 4)] * _RowAccess[fmod(screenPos.y, 4)]);
}
數(shù)值計(jì)算一般比用紋理采樣要快。
原模型加入紋理后如下圖
采樣的瑕疵很難避免,所以需要開啟軟陰影。
使用較低的陰影質(zhì)量時的情況:
瑕疵基本可以接受,但在鏡頭移動的時候會產(chǎn)生一定的抖動現(xiàn)象,因此最好還是保持較高的精度。
而描邊本身的陰影……因?yàn)镾hadowCast只能存在一個。如果想生成這個可能只能復(fù)制一個單獨(dú)的描邊材質(zhì)了,這個就算了吧。
需要注意的是,繪制陰影的時候需要嚴(yán)格對齊像素,所以需要獲得shadowmap紋理的具體大小,而_ScreenParams那一系列函數(shù)是無效的。即使定下某個固定縮放數(shù)值,如果使用了層級陰影,切換到不同級別的時候也無法統(tǒng)一。
這里獲取具體的屏幕坐標(biāo)用了VPOS,具體寫法可查看代碼:
//shadowCast
struct v2f_shadow
{
float2 uv : TEXCOORD2;
};
void transparencyClip(float alpha, float2 screenPos)
{
// Screen-door transparency: Discard pixel if below threshold.
float4x4 thresholdMatrix =
{ 1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0,
13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0,
4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0,
16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0
};
float4x4 _RowAccess = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
clip(alpha - thresholdMatrix[fmod(screenPos.x, 4)] * _RowAccess[fmod(screenPos.y, 4)]);
}
v2f_shadow vert_shadow(appdata_base v,out float4 outpos : SV_POSITION)
{
v2f_shadow o;
TRANSFER_SHADOW_CASTER_NOPOS(o, outpos)
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
float4 frag_shadow(v2f_shadow i, UNITY_VPOS_TYPE screenPos : VPOS) :SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv) * _Color;
transparencyClip(col.a,screenPos.xy);
SHADOW_CASTER_FRAGMENT(i)
}
關(guān)于“unity怎么實(shí)現(xiàn)半透明物體的描邊和投影”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“unity怎么實(shí)現(xiàn)半透明物體的描邊和投影”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
標(biāo)題名稱:unity怎么實(shí)現(xiàn)半透明物體的描邊和投影
本文鏈接:http://jinyejixie.com/article16/jjijgg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站策劃、企業(yè)建站、網(wǎng)頁設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)