溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Unity Shader如何實現(xiàn)雨天的水面漣漪效果

發(fā)布時間:2021-08-23 15:08:39 來源:億速云 閱讀:460 作者:小新 欄目:大數(shù)據(jù)

這篇文章給大家分享的是有關(guān)Unity Shader如何實現(xiàn)雨天的水面漣漪效果的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Unity Shader如何實現(xiàn)雨天的水面漣漪效果

Unity Shader如何實現(xiàn)雨天的水面漣漪效果

Unity Shader如何實現(xiàn)雨天的水面漣漪效果

上個動態(tài)效果......

項目需求,需要加一個雨天的水面漣漪效果,一開始的想法是直接加特效,但過過腦子就知道有多費,不現(xiàn)實,最好的方法還是要用shader來實現(xiàn),但是如何實現(xiàn)紋理的隨機擴散(雨滴有大有?。筒灰?guī)則的時間(雨滴有先有后),想了很久都沒想明白,好在從AssetStore里發(fā)現(xiàn)了類似的效果,一頓研究以后,發(fā)現(xiàn)其實挺簡單的......拿出來跟大家分享。

剛才我說的兩個問題,隨機擴散和不規(guī)則時間,這位大神用貼圖來解決了(一開始我們想過,但是沒有想到實現(xiàn)方法),接下來展示一下這張圖。

Unity Shader如何實現(xiàn)雨天的水面漣漪效果

這樣看起來有點莫名其妙對吧,我們把四個通道來分開看,就清楚多了。

Unity Shader如何實現(xiàn)雨天的水面漣漪效果

我來分別解釋一下,R通道代表了漣漪生成的范圍,并且?guī)в械龅男Ч?,GB兩個通道是高度,差不多就是法線圖的效果,A通道用來存儲時間差,從白到黑不同的顏色值代表了不同的時間。

接下來相信很多人就已經(jīng)明白怎么寫了,這里我貼出了代碼,重要的地方都加了點自己的理解,沒有多少行,還是比較簡單的。

Shader "Custom/Ripple" {  Properties {    _Color ("Color", Color) = (1,1,1,1)    _MainTex ("Albedo (RGB)", 2D) = "white" {}    _Glossiness ("Smoothness", Range(0,1)) = 0.5    _Metallic ("Metallic", Range(0,1)) = 0.0    _RippleTex("RippleTex", 2D) = "white" {}    _RippleScale("RippleScale",Range(1,10)) =1
 }  SubShader {    Tags { "RenderType"="Opaque" }    LOD 200
   CGPROGRAM    // Physically based Standard lighting model, and enable shadows on all light types    #pragma surface surf Standard fullforwardshadows    #pragma target 3.0    #define PI 3.141592653    sampler2D _MainTex;
   struct Input {      float2 uv_MainTex;      half2 texcoord;    };
   half _Glossiness;    half _Metallic;    fixed4 _Color;    sampler2D _RippleTex;    float _RippleScale;    UNITY_INSTANCING_BUFFER_START(Props)    UNITY_INSTANCING_BUFFER_END(Props)
   //計算波紋的主函數(shù)    float3 ComputeRipple(float2 uv, float t)    {      //波紋貼圖采樣,并把采樣的高度值擴展到-1到1。      float4 ripple = tex2D(_RippleTex, uv);      ripple.yz = ripple.yz * 2.0 - 1.0;      //獲取波紋的時間,從A通道獲取不同的波紋時間,      float dropFrac = frac(ripple.a + t);      //把時間限制在R通道內(nèi)      float timeFrac = dropFrac - 1.0 + ripple.x;      //做淡出處理      float dropFactor = 1-saturate( dropFrac);      //計算最終的高度,用一個sin計算出隨時間的振幅,修改一下值就知道什么效果了      float final = dropFactor* sin(clamp(timeFrac * 9.0, 0.0, 4.0) * PI);      return float3(ripple.yz * final, 1.0);    }
   void surf (Input IN, inout SurfaceOutputStandard o) {      fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;      o.Albedo = c.rgb;
     //調(diào)用方法,獲取高度。這里我懶得用一個新uv,索性直接用的主貼圖UV      float3 ripple = ComputeRipple(IN.uv_MainTex / _RippleScale, _Time.y);      // Metallic and smoothness come from slider variables      o.Metallic = _Metallic;      o.Smoothness = _Glossiness;      //賦值到法線上      o.Normal = ripple;      o.Alpha = c.a;    }    ENDCG  }  FallBack "Diffuse"}

感謝各位的閱讀!關(guān)于“Unity Shader如何實現(xiàn)雨天的水面漣漪效果”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI