10.热空气扭曲效果
生活随笔
收集整理的這篇文章主要介紹了
10.热空气扭曲效果
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Shader "Study/10_Distortion" {Properties{_NoiseTex("絮亂圖", 2D) = "white" {} // 絮亂圖_AreaTex("區(qū)域圖(Alpha):白色為顯示區(qū)域,透明為不顯示區(qū)域", 2D) = "white" {} // 區(qū)域圖_MoveSpeed("絮亂圖移動(dòng)速度", range(0,1.5)) = 1 // 絮亂圖移動(dòng)速度_MoveForce("絮亂圖疊加后移動(dòng)強(qiáng)度", range(0,0.1)) = 0.1 // 絮亂圖疊加強(qiáng)度,多張運(yùn)動(dòng)紋理疊加后再相乘的系數(shù)}Category{// 【渲染隊(duì)列】在透明物體前,類型為【透明】Tags{ "Queue" = "Transparent+1" "RenderType" = "Transparent" }// 最終透明混合 = 貼圖RGB*貼圖A + 背景RGB*(1-貼圖A)// 透明混合【源的A值】【1-SrcAlpha】Blend SrcAlpha OneMinusSrcAlpha // 該寫法為最常用最真實(shí)的透明混合顯示,半透明圖的正常顯示// GEuqal 點(diǎn)的alpha值大于等于0.01時(shí)渲染AlphaTest Greater .01 // 在PS區(qū)域圖時(shí),不顯示的地方透明度為0即可。// 關(guān)閉剔除,關(guān)閉燈光,不記錄深度Cull Off Lighting Off ZWrite OffSubShader{GrabPass{Name "BASE"//在后續(xù)的通道中可以使用給定的名字來引用這個(gè)紋理。當(dāng)你在1個(gè)場景中有多個(gè)對象使用grab pass 時(shí)候,這樣做會(huì)提高效率。Tags{ "LightMode" = "Always" }}Pass{Name "BASE"Tags{ "LightMode" = "Always" }CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"struct appdata_t {float4 vertex : POSITION; // 輸入的模型坐標(biāo)頂點(diǎn)信息float2 texcoord: TEXCOORD0; // 輸入的模型紋理坐標(biāo)集};struct v2f {float4 vertex : POSITION; // 輸出的頂點(diǎn)信息float4 uvgrab : TEXCOORD0; // 輸出的紋理做標(biāo)集0float2 uvmain : TEXCOORD1; // 輸出的紋理坐標(biāo)集1};float _MoveSpeed; // 聲明絮亂圖移動(dòng)速度float _MoveForce; // 聲明運(yùn)動(dòng)強(qiáng)度float4 _NoiseTex_ST; // 絮亂圖采樣float4 _AreaTex_ST; // 區(qū)域圖采樣sampler2D _NoiseTex; // 絮亂圖樣本對象sampler2D _AreaTex; // 區(qū)域圖樣本對象sampler2D _GrabTexture; // 全屏幕紋理的樣本對象,由GrabPass賦值v2f vert(appdata_t v){v2f o;// 從模型坐標(biāo)-世界坐標(biāo)-視坐標(biāo)-(視覺平截體乘以投影矩陣并進(jìn)行透視除法)-剪裁坐標(biāo)o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);// 將裁剪坐標(biāo)中的【頂點(diǎn)信息】進(jìn)行換算給uvgrab賦值
#if UNITY_UV_STARTS_AT_TOP // Direct3D類似平臺(tái)scale為-1;OpenGL類似平臺(tái)為1。float scale = -1.0;
#elsefloat scale = 1.0;
#endifo.uvgrab.xy = (float2(o.vertex.x, o.vertex.y * scale) + o.vertex.w) * 0.5;o.uvgrab.zw = o.vertex.zw;// 區(qū)域圖紋理:獲取輸入的紋理坐標(biāo)集,并且使用_MainTex_ST采樣圖,支持在視檢器調(diào)節(jié)縮放和偏移值o.uvmain = TRANSFORM_TEX(v.texcoord, _AreaTex);//o.uvgrab = TRANSFORM_TEX(v.texcoord, _AreaTex);return o;}half4 frag(v2f i) : COLOR{// 控制【UV的運(yùn)動(dòng)】,這樣在進(jìn)行采樣時(shí),offsetColor1拿到的顏色也是運(yùn)動(dòng)的。half4 offsetColor1 = tex2D(_NoiseTex, i.uvmain + _Time.xz * _MoveSpeed);// 將xy與xz交叉位移half4 offsetColor2 = tex2D(_NoiseTex, i.uvmain - _Time.yx * _MoveSpeed);// 將xy與yx交叉位移// 將【正在移動(dòng)的絮亂圖紋理信息】的rg用于給uvgrab累加,加2個(gè)col就會(huì)出現(xiàn)2個(gè)絮亂圖紋理i.uvgrab.x += ((offsetColor1.r + offsetColor2.r) - 1) * _MoveForce; // 疊加強(qiáng)度i.uvgrab.y += ((offsetColor1.g + offsetColor2.g) - 1) * _MoveForce;// 本來只會(huì)顯示物體背后的屏幕紋理(視覺上該物體透明了)// 但是上面給x,y疊加了運(yùn)動(dòng)的rg值,所以就形成透明絮亂圖運(yùn)動(dòng)的效果half4 noiseCol = tex2Dproj(_GrabTexture, UNITY_PROJ_COORD(i.uvgrab));// 屏幕紋理不需要透明,所以設(shè)置為1。noiseCol.a = 1.0f;// 對區(qū)域圖進(jìn)行采樣。half4 areaCol = tex2D(_AreaTex, i.uvmain);// 紋理相乘:區(qū)域紋理RBG都為1,區(qū)域紋理A為O的像素將不會(huì)顯示// 即可達(dá)到絮亂圖在區(qū)域圖中才顯示的效果。return noiseCol * areaCol;}ENDCG}//end pass }//end subshader// 用于老式顯卡SubShader{Blend DstColor ZeroPass{Name "BASE"SetTexture[_MainTex]{ combine texture }}}}
}
原理大概如下:
1:通過grabpass 獲取全屏得到圖像
2:通過維護(hù)一個(gè)grabuv(包括通過時(shí)間位移該uv)從獲取的截屏圖像中取出相應(yīng)紋理信息
3:通過正常的uv取出紋理信息,并與從截屏圖像中取出的紋理信息進(jìn)行混合
總結(jié)
以上是生活随笔為你收集整理的10.热空气扭曲效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9.球体阴影
- 下一篇: 信用卡没激活怎么注销?注销相关事项必知!