Unity3D Shader 復古電影熒幕特效

2022-06-01 16:45:13 字數 3417 閱讀 3358

【舊部落格轉移 - 2023年12月6日 18:12】

今天用shader做了乙個復古熒幕效果,老電視機放映的感覺,寫篇文章記錄一下

原始:

沒錯,這就是電影《鐵達尼號》的劇照。船撞到冰山上翻了,氣溫非常低,男主角傑克,找到了一塊木板,讓女主角睡在上面保住了性命,自己被凍成冰塊沉入海底,還是蠻感人的。

實現原理就是用到幾張特效圖,加入一些抖動效果

1.暈影圖(vignette effect)

2.螢幕劃痕scratches和 灰塵汙點dust

shader實現:

half2 maintexuv = half2(i.uv.x, i.uv.y+(_randomvalue*_sintime.z * 0.005

)); fixed4 maintex = tex2d(_maintex, maintexuv);

取樣主紋理,uv值y加上了乙個隨機值,實現上下抖動的效果。

_sintime是unity內建的乙個變數,用來獲取乙個-1到1範圍的sin函式值

half2 scratchesuv = half2(i.uv.x + (_randomvalue * _sintime.z *_scratchesxspeed),

i.uv.y + (_randomvalue * _time.x *_scratchesyspeed));

fixed4 scratchestex = tex2d(_scratchestex, scratchesuv);

取樣劃痕紋理,這裡的uv值,採用隨機數乘以x,y軸分別的速度,來實現螢幕隨機位置的閃動效果,灰塵紋理也是一樣的處理

//

轉成yiq色彩空間,取出亮度值

fixed lum = dot(fixed3(0.299, 0.587, 0.114

), maintex.rgb);

fixed4 finalcolor = lum + lerp(_sepiacolor, _sepiacolor + fixed4(0.1f, 0.1f, 0.1f, 0.1f), _randomvalue);

這一步是把rgb顏色空間轉換成yiq顏色空間,yiq色彩空間通常被電視系統所採用,在yiq系統中,y分量代表影象的亮度資訊,i、q兩個分量則攜帶顏色資訊,i分量代表從橙色到青色的顏色變化,而q分量則代表從紫色到黃綠色的顏色變化。將彩色影象從rgb轉換到yiq色彩空間,可以把彩色影象中的亮度資訊與色度資訊分開,分別獨立進行處理。

再加上乙個棕褐色調_sepiacolor,這裡用lerp函式做乙個線性插值,實現明暗之間的漸變

fixed3 constantwhite = fixed3(1, 1, 1

);finalcolor = lerp(finalcolor, finalcolor *vignettetex, _vignetteamount);

finalcolor.rgb *=lerp(scratchestex, constantwhite, _randomvalue);

finalcolor.rgb *= lerp(dusttex, constantwhite, (_randomvalue *_sintime.z));

finalcolor = lerp(maintex, finalcolor, _effectamount);

最後把顏色彙總,用一些線性插值實現漸變,然後把顏色值相乘得到最後的結果。返回給fragment著色器輸出,就可以得到上面的效果。

完整shader:

shader "

lijia/oldeffect"

//暈影圖

_vignettetex("

vignettetex

", 2d) = "

white"{}

_vignetteamount (

"vignette opacity

", range(0, 1)) = 1

//劃痕

_scratchestex("

scratchestex

", 2d) = "

white"{}

_scratchesxspeed(

"scratchesxspeed

", float) = 100

_scratchesyspeed(

"scratchesyspeed

", float) = 100

//灰塵

_dusttex("

dusttex

", 2d) = "

white"{}

_dustxspeed(

"_dustxspeed

", float) = 100

_dustyspeed(

"_dustyspeed

", float) = 100

//老舊的褐色調

_sepiacolor("

_sepiacolor

", color) = (1, 1, 1, 1

) _randomvalue(

"randomvalue

", float) = 1.0

_effectamount (

"old film effect amount

", range(0, 1)) = 1

} subshader

pass ;

fixed4 frag(v2f i): color

endcg

} }fallback

"diffuse

"}

擴充套件:這時我們可以用混合模式

官方文件的解釋

blend dstcolor zero是乘以color緩衝區的顏色的,而這個特效剛好是用到乘法

分了兩個pass來實現

第乙個pass先處理色調

pass 

endcg

}

第二個pass再把剩下的疊加上去,跟之前一樣處理就行了。

fixed4 frag(v2f_img i): color

感謝讀你的文章讓我學到了很多知識

Unity3d Shader 運動模糊

攝影常用的一招就是延時攝影,以使運動的物體產生運動模糊。攝影技巧為 1,三角架固定相機 2,調長 時間 3,物件有運動物體和靜止物體參照 用了延時攝影,會產生藝術感,見下圖 2015年1月 拍攝於上海陸家嘴 遊戲方面可喜的是unity3d也可以實現類似效果,先看效果圖 第一張為無運動模糊 第二張為有...

Unity3D Shader 入門學習

unity3d 的所有渲染工作離不開著色器.shader 著色器其實是一小段程式,它負責將輸入的mesh網格.以指定的方式和輸入的貼圖或者顏色等組合作用.然後輸出.繪圖單元可以依據這個輸出來將影象繪製到螢幕上 輸入的貼圖或顏色等,加上對應的shader,以及對shader的特定引數設定,將這些內容 ...

unity3d shader之浮雕效果

浮雕就是對影象上的乙個畫素和它右下的那個畫素的色差的一種處理 非常容易,只需要乙個簡單的演算法 用fragment shader來實現 我們只看實現部分就好 在frag函式中 mc00mc tex2d maintex,i.uv maintex rgb 獲取當前點的顏色 mc11 tex2d main...