這些螢幕特效是咋實現的

2021-09-22 22:54:16 字數 1552 閱讀 7926

隨著圖形卡以及影象 api 的公升級換代,越來越多的特效使用可程式設計渲染實現,也是就是所謂的著色器。不同實時渲染介面的著色器語法不盡相同,在英偉達的統一下,cg 語言成為行業標準(下列片元著色器**片段中均使用 cg 語法),著色器**在實時渲染的地位越來越高,許多經典的螢幕特效也源於著色器

柏林雜訊的發明者 ken perlin 因此演算法獲得奧斯卡科技成果獎,該雜訊符合自然規律,可以模擬很多自然現象,比如雲霧、消融、火焰等效果。基本思想是在兩兩隨機數之間進行平滑差值,讓隨機數生成具有過渡性,而不是斷落變化

平滑插值

插值是圖形學的基礎運算 lerp(a,b,c) = a * c + (1 - c)*b

說到平滑插值,最有必要聊聊貝塞爾曲線,做過動畫的小夥伴就知道,動畫進度如果與時間成正比,動畫會很單調,我們常常看到的 ui 彈窗動畫都會「俏皮」回彈一下,這樣的動畫玩家更會買賬,根據貝塞爾曲線模擬出響應的動畫速度,比如先慢後快,比如回彈,比如越來越快等等

先慢後快的貝塞爾曲線

回彈的貝塞爾曲線

float rand(float2 p)

// 二維柏林雜訊

float noise(float2 x)

// 多雜訊疊加,**可以優化成不用迴圈的

頂點著色器傳遞給片元著色器的紋理座標 uv, 是片元著色器的最基礎引數,我們適當加以擾動可以做出很多絢麗的效果。比如水波紋效果,用的是正/餘函式的擾動來模擬水波效果

sampler2d _maintex;

float _amount;

float _w;

float _speed;

fixed4 frag (v2f i) : sv_target

; float2 uv = i.uv;

float2 dt = center_uv - uv;

float len = sqrt(dot(dt, dt));

float amount = min(_amount,_amount / (0.0001 + len*len*_speed));

if(amount < 0.005) // 使用 step 優化

水波特效的實現

增加波源 俗話說 無風不起浪,為了形成水波,我們必須在水池中加入波源,你可以想象成向水中投入石頭,形成的波源的大小和能量與石頭的半徑和你扔石頭的力量都有關係。知道了這些,那麼好,我們只要修改波能資料緩衝區buf,讓它在石頭入水的地點來乙個負的 尖脈衝 即讓buf x,y n。經過實驗,n的範圍在 3...

這些霸主是怎麼成功的?

中國的網際網路歷史是短暫的,然而也不短了,十多年的歷史。中國的網際網路產生了數家成功的企業 1 抓住了中文資訊資源缺乏的歷史初期網民對資訊資源的整合需求。2 乙個技術背景的管理領袖但是卻絕對沒有一般技術人員的狹隘性 3 歷史機遇,抓住了發展時期的歷史性機遇 4 足夠的股份制企業的運營資源使得能夠等到...

iOS的幾個特效實現思路

效果如圖 這種抽屜效果很常見,開源元件也很多。但是一般開源元件都對controller的結構有要求,有時候不是很方便。func addsidepanelcontroller func animatepanel shouldexpand shouldexpand bool else func anim...