Unity3D Shader(17) 水的折射

2021-08-07 06:56:13 字數 2108 閱讀 4359

這裡引用的是蠻牛的unity3d shader的高階教程裡的**。諮詢:qq254033230

這裡依然用的是vertex 和fragment shader來解決水的反射的問題。

首先,準備兩個平面,乙個平面作為底圖,乙個平面模擬水的波動。這裡要用到抓取底圖的通道 grabpass{}。然後把抓取的通道圖放到水面的那張圖上。另外乙個難點就是要模擬水的波動,水的波動的原理如下圖:

其中頂點函式**和片段函式**如下:

如果想最後的貼圖是隨著法線變化,那麼就要用到偏導數,計算每個頂點的動態法線。

float w=2*3.1415926/_l;

float f=_s*w;

v.vertex

.y+=_a*sin(-length(v.vertex

.xz)*w+_time.x*f);

float dx=_a*v.vertex

.x*w*cos(-length(v.vertex

.xz)*w+_time.x*f);

float dz=_a*v.vertex

.z*w*cos(-length(v.vertex

.xz)*w+_time.x*f);

float3 b=normalize(float3(1,dx,0));

float3 t=normalize(float3(0,dz,1));

v2f o;

o.n=cross(b,t);

o.pos=mul(unity_matrix_mvp,v.vertex);

o.uv=transform_tex(v.uv,_maintex);

o.proj=computegrabscreenpos(o.pos);

return o;

}float4 frag(v2f in):sv_target

以上還不算完美,可以加上漫反射,讓水的顏色隨著波紋變化。

float w=2*3.1415926/_l;

float f=_s*w;

v.vertex

.y+=_a*sin(-length(v.vertex

.xz)*w+_time.x*f);

float dx=_a*v.vertex

.x*w*cos(-length(v.vertex

.xz)*w+_time.x*f);

float dz=_a*v.vertex

.z*w*cos(-length(v.vertex

.xz)*w+_time.x*f);

float3 b=normalize(float3(1,dx,0));

float3 t=normalize(float3(0,dz,1));

v2f o;

o.n=cross(b,t);

o.pos=mul(unity_matrix_mvp,v.vertex);

o.uv=transform_tex(v.uv,_maintex);

o.proj=computegrabscreenpos(o.pos);

return o;

}float4 frag(v2f in):sv_target

最終的效果:

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...