Shader實例跳動心臟

用Shader來繪制一個跳動的心臟。效果圖


代碼如下:

Shader"Custom/Heart"{

SubShader{

pass{

CGPROGRAM

#pragmavertexvert

#pragmafragmentfrag

#include"UnityCG.cginc"

//1.心形Shader的渲染需要拿到紋理坐標來進行渲染

//2.位置綁定

struct v2f{

float4 pos:POSITION;

float2 uv:TEXTCOORD0;

};

v2f?vert(appdata_full?v)

{

v2f?o;

//坐標轉換

o.pos?=mul(UNITY_MATRIX_MVP,v.vertex);

//將心形中心點設置到紋理坐標中央(即(0.5,0.5)=>(0,0)),4為縮放比例

o.uv?=4*v.texcoord.xy-fixed2(2,2);

returno;

}

float4 frag(v2f?i):COLOR{

//背景顏色亮暗可以通過(1,.0.8,0.7)*(r(0到1之間的值))來達到

//距離中心越遠r值越小

//length(q)q向量的的長度

fixed3 background?= fixed3(1,0.8,0.7-0.07*i.uv.y)*(1-0.25*length(i.uv));

//控制心跳時間和函數橫向長縱向短

//利用時間控制周期

float tt?=fmod(_Time.y,1.0)/1.0;

float ss?=pow(tt,.2)*.5+.5;

ss?-=?ss*0.2*sin(tt*6.2831*3.0)*exp(-tt*4.0);

i.uv?*=float2(0.5,1.5)?+float2(0.5,?-0.5)/ss;

//心形函數

float a=abs(atan2(i.uv.y,i.uv.x))/3.141593;

float r?=length(i.uv);

//利用函數調節心形函數

float d?=?(13*a-22*a*a+10*a*a*a)/(6-5*a);

fixed3 hcol?=fixed3(1,0,0.3);

//背景顏色與心顏色過渡用Lerpsmoothstep做平滑處理

fixed3 col?=lerp(background,?hcol,smoothstep(-0.01,0.01,?d-r));

return fixed4(col,1);

}

ENDCG

}

}

Fallback"Diffuse"

}

1.心形畫法的原理

利用心形函數方程的特性

如圖所示? 心形曲線上的每個點到原點的距離與每個點到x軸的夾角的弧度制存在著一定的比例

我們可以利用這個來畫心。

2. 坐標的設置

根據紋理坐標的性質,通過獲取到紋理坐標,然后來設置坐標軸的原點位置以及在顯示方面的大小。這里我們是把心形中心點設置到紋理坐標中央(即(0.5,0.5)=>(0,0)),4為縮放比例o.uv?=4*v.texcoord.xy-fixed2(2,2);

3.圖形的畫制

atan2(i.uv.y,i.uv.x)求的是向量所對應的角度。求得的是弧度制的值,除以pi后得到的范圍是[0,1];所以上面的函數就是求得平面上的坐標點所對應向量的角度(被映射到[0,1]之間);然后只需要把心形里面和外面渲染成不同的顏色即可。方法是用step方法,這里用smoothstep,使得邊緣不那么硬, 然后結合lerp方法,如下:

float a=atan2(i.uv.y,i.uv.x)/3.141593;

float r?=length(i.uv);

fixed3 col =lerp(background, hcol,smoothstep(-0.01,0.01, a-r));


這樣只是畫了半顆心,需要翻轉xy軸,并取絕對值,
即可


4.利用函數調節心形

利用下面函數可以來調節心形

曲線如下

//利用函數調節心形函數

float d?=?(13*a-22*a*a+10*a*a*a)/(6-5*a);


5.心形跳動的算法

原理就是通過一定比例來改變心形的長寬的比例,然后讓這種變化呈現一種周期性的變化。

我們這里有了一個接近于心跳規律的函數來控制。


//控制心跳時間和函數橫向長縱向短


//利用時間控制周期

float tt?=fmod(_Time.y,1.0)/1.0;

float ss?=pow(tt,.2)*.5+.5;

ss?-=?ss*0.2*sin(tt*6.2831*3.0)*exp(-tt*4.0);

i.uv?*=float2(0.5,1.5)?+float2(0.5,?-0.5)/ss;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容