Shader基礎(chǔ)篇—輪廓增強(轉(zhuǎn))

1、介紹:如圖所示划乖,兩個膠囊體都是采用同樣的透明度混合方程進行混合的,并且顏色和透明度都一樣挤土。而左邊的對透明度進行了“特殊”的處理琴庵,就得到了和右邊不一樣的效果:膠囊體的邊沿輪廓增強。

配合采用貼圖的效果如圖所示:兩者都是采用了一樣的透明度貼圖以及透明度混合方法,左邊的是采用了輪廓增強的效果圖迷殿。

2儿礼、原理:首先,計算出模型表面的輪廓庆寺,這不廢話嗎蚊夫,其實還真不是廢話,因為并不是所有的模型我們都能預(yù)先知道它的輪廓懦尝,當(dāng)然經(jīng)過特殊處理的除外知纷。怎么樣去判斷模型的網(wǎng)格點是屬于輪廓邊緣上呢。

這里我們定義模型的網(wǎng)格點的法線方向為N如上圖所示的藍色線陵霉,攝像機的觀察方向為V琅轧。當(dāng)N和V方向正交的時候,也即V.N=0,我們就判斷這個點為輪廓點撩匕。實際上很少出現(xiàn)這種情況鹰晨,因此,我們將點積V.N接近于0的點都可以看做是靠近輪廓止毕。因此我們的透明度計算方程可以這么寫:a=min(1,a/|V.N|)模蜡。

3、實現(xiàn)效果的Shader代碼:

1>:不加貼圖的Shader代碼:

本帖隱藏的內(nèi)容

[C#]純文本查看復(fù)制代碼

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Unlit/Cg silhouette enhancement"

{

Properties{

_Color("Color", Color) = (1, 1, 1, 0.5)

// user-specified RGBA color including opacity

}

SubShader{

Tags{ "Queue" = "Transparent" }

// draw after all opaque geometry has been drawn

Pass{

ZWrite Off // don't occlude other objects

Blend SrcAlpha OneMinusSrcAlpha // standard alpha blending

//==float4 result = fragment_output.aaaa * fragment_output + (float4(1.0, 1.0, 1.0, 1.0) - fragment_output.aaaa) * pixel_color;

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

uniform float4 _Color; // define shader property for shaders

struct vertexInput {

float4 vertex : POSITION;

float3 normal : NORMAL;

};

struct vertexOutput {

float4 pos : SV_POSITION;

float3 normal : TEXCOORD;

float3 viewDir : TEXCOORD1;

};

vertexOutput vert(vertexInput input)

{

vertexOutput output;

float4x4 modelMatrix = unity_ObjectToWorld;//模型矩陣

float4x4 modelMatrixInverse = unity_WorldToObject;//模型的逆矩陣

output.normal = normalize(

mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);

output.viewDir = normalize(_WorldSpaceCameraPos

- mul(modelMatrix, input.vertex).xyz);

output.pos = mul(UNITY_MATRIX_MVP, input.vertex);

return output;

}

float4 frag(vertexOutput input) : COLOR

{

//為什么在頂點著色器程序中已經(jīng)將這兩個向量歸一化了扁凛,在此為什么還要歸一化忍疾?

//1>首先,在頂點程序中歸一化是因為要在任何它們之間的方向上進行或多或少的插值

//2>在此處又進行一次插值是因為谨朝,上面的插值過程會將歸一化的值扭曲

float3 normalDirection = normalize(input.normal);

float3 viewDirection = normalize(input.viewDir);

float newOpacity = min(1.0, _Color.a

/ abs(dot(viewDirection, normalDirection)));

return float4(_Color.rgb, newOpacity);

}

ENDCG

}

}

}

2>:貼圖渲染的代碼:

將片段Shader的代碼替換成下面的代碼卤妒,

本帖隱藏的內(nèi)容

[C#]純文本查看復(fù)制代碼

float4 frag(vertexOutput input) : COLOR

{

//為什么在頂點著色器程序中已經(jīng)將這兩個向量歸一化了,在此為什么還要歸一化字币?

//1>首先则披,在頂點程序中歸一化是因為要在任何它們之間的方向上進行或多或少的插值

//2>在此處又進行一次插值是因為,上面的插值過程會將歸一化的值扭曲

float3 normalDirection = normalize(input.normal);

float3 viewDirection = normalize(input.viewDir);

float4 tex = tex2D(_MainTex, input.tex.xy);

float3 col = tex;

float newOpacity = min(1.0, tex.a / abs(dot(viewDirection, normalDirection)));

return float4(col, newOpacity);

}

ENDCG

}

4洗出、總結(jié):輪廓增強在很多效果的應(yīng)用都非常實用的士复,比如主角邊緣發(fā)光效果、渲染一些云母生物翩活,如下圖所示阱洪,總之是一個非常實用的小技巧。

原文參考資料來自

https://en.wikibooks.org/wiki/Cg_Programming/Unity/Silhouette_Enhancement

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菠镇,一起剝皮案震驚了整個濱河市冗荸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌利耍,老刑警劉巖蚌本,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盔粹,死亡現(xiàn)場離奇詭異,居然都是意外死亡魂毁,警方通過查閱死者的電腦和手機玻佩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席楚,“玉大人咬崔,你說我怎么就攤上這事》持龋” “怎么了垮斯?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長只祠。 經(jīng)常有香客問我兜蠕,道長,這世上最難降的妖魔是什么抛寝? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任熊杨,我火速辦了婚禮,結(jié)果婚禮上盗舰,老公的妹妹穿的比我還像新娘晶府。我一直安慰自己,他們只是感情好钻趋,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布川陆。 她就那樣靜靜地躺著,像睡著了一般蛮位。 火紅的嫁衣襯著肌膚如雪较沪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天失仁,我揣著相機與錄音尸曼,去河邊找鬼。 笑死萄焦,一個胖子當(dāng)著我的面吹牛骡苞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楷扬,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贴见!你這毒婦竟也來了烘苹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤片部,失蹤者是張志新(化名)和其女友劉穎镣衡,沒想到半個月后霜定,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡廊鸥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年望浩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惰说。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡磨德,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吆视,到底是詐尸還是另有隱情典挑,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布啦吧,位于F島的核電站您觉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏授滓。R本人自食惡果不足惜琳水,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望般堆。 院中可真熱鬧在孝,春花似錦、人聲如沸郁妈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽噩咪。三九已至顾彰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胃碾,已是汗流浹背涨享。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留仆百,地道東北人厕隧。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俄周,于是被迫代替她去往敵國和親吁讨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容