您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Unity Shader如何實現(xiàn)雨天的水面漣漪效果的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
上個動態(tài)效果......
項目需求,需要加一個雨天的水面漣漪效果,一開始的想法是直接加特效,但過過腦子就知道有多費,不現(xiàn)實,最好的方法還是要用shader來實現(xiàn),但是如何實現(xiàn)紋理的隨機擴散(雨滴有大有?。筒灰?guī)則的時間(雨滴有先有后),想了很久都沒想明白,好在從AssetStore里發(fā)現(xiàn)了類似的效果,一頓研究以后,發(fā)現(xiàn)其實挺簡單的......拿出來跟大家分享。
剛才我說的兩個問題,隨機擴散和不規(guī)則時間,這位大神用貼圖來解決了(一開始我們想過,但是沒有想到實現(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é)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(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)容。