unity實現描邊的問題彙總

2021-08-31 00:06:22 字數 2897 閱讀 4627

在遊戲中,我們都喜歡加一些描邊效果,來凸顯人物的邊緣,提高識別度。美術一般都喜歡加。描邊方式一般有兩種,一種的模型邊緣描邊,一種的人物的轉折點描邊(這種需要用到卷軸)

在遊戲中比較常用的就是模型邊緣描邊了,shader一般是這樣

shader "outline"	} 

//子著色器

subshader

;

fixed4 frag(v2f i) : sv_target

//使用vert函式和frag函式

#pragma vertex vert

#pragma fragment frag

endcg

} //正常著色的pass

pass

}//前面的shader失效的話,使用預設的diffuse

fallback "diffuse"

}

第乙個問題:但是,如果這樣放到遊戲中回有一定的問題

可以看到,一些邊緣的地方其實沒顯示邊緣色,導致看起來是斷層的。

原因是我們剔除了前面

就比較完美了。然後我一位這樣就解決了。

第二個問題:但是後面在主場景中發現乙個問題

再後來,發現出現這個問題的情景時兩個人物疊加在一起。

由於渲染了front,兩個英雄的向前的點會重疊(因為渲染完乙個人物的兩個pass,再到另乙個人物的)

然後我想到的解決辦法時,加乙個模板,但大於等於0的點就設定為zero。

可以看到沒有顯示黑的一團。

第三個問題:在渲染3d和2d結合的介面,如果我們直接渲染3d(而不是用rt來間接實現)的話會出現看不到描邊的問題。這個的原因就是因為ui是會在3d模型之後渲染的,然後我們描邊是不回寫深度的

因為我們遊戲用的是ngui,用uitexture來顯示背景,所以會按照ui的方式顯示在前面。所以我用了乙個quad去實現背景,

至此就解決了描邊的遇到的問題了。

當然很多人可能會說

對,是會顯示不出來,因為他也是ui。但是要根據實際情況並且消耗情況,製作複雜情況來決定。這個擋板沒描邊是可以接受的,所以我們用乙個比較簡單消耗低的方式實現。

當然如果你要完全顯示描邊,那就可以把rt放到camera的target上,然後用uitexture或quad去裝載這個rt,就能完全實現,但這樣會對乙個相機,並且每幀都要去做這樣的操作。具體需要自己權衡。

注意:

1。描邊的物件菱角最好不要多,因為描邊是通過法線拓開面的方式做的,所以面會往法線上移,所以菱角多可能會出現有些地方空了

2.計算過程如果一方歸一化後另一方也要歸一化,不然計算會涉及一些不相關的部位。

data.ndotv.x = saturate(dot(normalize(v.normal), normalize(v)));

3.其實這裡光照計算不需要用到真實光照,只需要知道乙個光照方向就好了,模擬出真實光照感覺。因為如果用真實光,如果你每個場景人物的旋轉角度不一致,那麼看上去是不一致的,那麼這時要調整光照。那麼調整光照方向就是最直接的。

float3 lightdirnorm = normalize(_lightdir.xyz);

data.lightdir = lightdirnorm;

之後只需要用這個光照方向去計算邊緣光,暗部渲染,高光等就好了,注意如果用到matcap,matcao的高亮部位要跟這個方向一致。

4.做matcap的時候我們會發現攝像機越遠他會出現越多的不相關暗部。

這裡是因為攝像機角度渲染時mask圖涉及的區域可能會超過範圍,這裡渲染的就會超過一點影響到貼圖的其他部位。那麼要減少這個影響,就應該根據攝像機的遠近來處理uv。減少影響。

(step(uvx1, s.uv_main.x) * step(s.uv_main.x, uvx2)) > 0 ? (_usematcap > 0 ? ((mask.a != 0) ? float3(c.rgb * matmaskacapcolor * 1.5) : float3(c.rgb * matcapcolor * _matcapcolor * 1.5)) : c.rgb) : c.rgb;

(step(uvx1, s.uv_main.x) * step(s.uv_main.x, uvx2))是說uv的x限制在uvx1和uvx2之間。

當超過了這個畫素 就用回c.rgb。其他部分都是matcap部分,就不細說了。

unity實現描邊效果

這裡總結了幾種在unity實現描邊效果的方法,首先準備乙個模型匯入在unity中,使用預設shader,上傳一張原始圖,以便後面實現功能效果的對比 一 邊緣光,這裡參照官方的乙個su ceshader example,rim lighting 1.在unity建立乙個su ceshader,命名ri...

描邊 深度 webgl實現物體描邊效果的方法介紹

前言終於把手頭的事結束了,可以有時間來研究研究技術 作為一名3d開發人員,僅僅使用現有的引擎來開發專案不免有些浮於表面,多研究研究底層的實現更利於對3d開發整體的把控 於是我決定最近開始研究webgl一些特效的實現,希望能在秋招前對底層有更深入的理解。這種方法不用進行法線與視線之間的計算,而是將物體...

Unity 使用shader給角色描邊異常

unity版本 unity 2018.2.0f2 64 bit shader實現如下 upgrade note replaced mul unity matrix mvp,with unityobjecttoclippos pragma fragmentoption arb precision hi...