unity Shader 扭曲效果

2021-08-13 19:30:48 字數 1966 閱讀 2286

所謂扭曲就是擾動乙個物體的uv座標,表現出來就是乙個擾動效果,如火焰扭曲空氣,和水波對水底的影響。

1. 在shader 中我們需要一張當前渲染的紋理

2. 給乙個物體渲染並使用當前紋理,用螢幕座標作為uv座標加上乙個擾動值

1. unity提供了抓取的pass: grabpass unity官網介紹

//每次遇到這個pass就去抓取一次提供了了乙個預設名稱_grabtexture 不推薦使用

grabpass

//第一次遇到去抓取一次每幀只會抓取一次,名稱由你自己定義

grabpass

2.

獲取物體的螢幕座標,unity也給出了內建函式

//官網**

v2f o;

// use unityobjecttoclippos from unitycg.cginc to calculate

// the clip-space of the vertex

o.pos = unityobjecttoclippos(v.vertex);

// use computegrabscreenpos function from unitycg.cginc

// to get the correct texture coordinate

o.grabpos = computegrabscreenpos(o.pos);

return o;

}

computegrabscreenpos 函式就是得到螢幕座標,下面是unitycg.cginc裡面的函式原始碼

inline float4 computegrabscreenpos (float4 pos)
unity_uv_starts_at_top 和裝置的紋理座標有關如圖

pos傳進來的座標是齊次裁剪座標x,y都在[-w,w]之間,不在這個範圍的會在光柵化之前(之後執行片段著色器)裁剪掉。轉換如圖 a->b 就是o.xy = float2(o.x, o.y*scale) + o.w;

最後還要歸一化得到最終紋理座標是除o.w實現的這個在tex2dproj紋理取樣中內建函式中實現的(紋理座標在[0,1])

uv擾動是對一張雜訊紋理採用加上偏移值,同時讓雜訊紋理做uv移動,達到每次採用不同來實現乙個動態的效果

熱浪扭曲效果

熱浪扭曲 每個人都對自然界中的這種大氣效果很熟悉 光線在穿過不同密度的介質時會彎曲 熱微光 熱空氣密度比冷空氣小 密度影響介質的折射率 熱空氣上公升的同時會被冷空氣替代,這會改變光射入眼睛的路線 渲染場景到rgba離屏快取 可渲染的紋理 顏色寫入rgb值 扭曲度寫入alpha通道 繪製全屏長方形到後...

熱浪扭曲效果

熱浪扭曲 每個人都對自然界中的這種大氣效果很熟悉 光線在穿過不同密度的介質時會彎曲 熱微光 熱空氣密度比冷空氣小 密度影響介質的折射率 熱空氣上公升的同時會被冷空氣替代,這會改變光射入眼睛的路線 渲染場景到rgba離屏快取 可渲染的紋理 顏色寫入rgb值 扭曲度寫入alpha通道 繪製全屏長方形到後...

熱浪扭曲效果

熱浪扭曲 每個人都對自然界中的這種大氣效果很熟悉 光線在穿過不同密度的介質時會彎曲 熱微光 熱空氣密度比冷空氣小 密度影響介質的折射率 熱空氣上公升的同時會被冷空氣替代,這會改變光射入眼睛的路線 渲染場景到rgba離屏快取 可渲染的紋理 顏色寫入rgb值 扭曲度寫入alpha通道 繪製全屏長方形到後...