Unity Shader實(shí)現(xiàn)水波紋效果
本文實(shí)例為大家分享了Unity Shader實(shí)現(xiàn)水波紋的具體代碼,供大家參考,具體內(nèi)容如下
效果:

Shader代碼:
Shader "Custom/shuibowen"{
Properties{
_MainTex("Base (RGB)",2D)="white"{}
_distanceFactor("Distancefactor",float)=1
_timeFactor("time factor",float)=2
_totalFactor("total factor",float)=3
_waveWidth("wave width",float)=4
_curWaveDis("curwave dis",float)=5
_startPos("star pos",Vector) = (1,1,1,1)
_MainTex_TexelSize("Maintex_texelSize",vector)=(1,1,1,1)
}
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
float4 _MainTex_TexelSize;
uniform float _distanceFactor;
uniform float _timeFactor;
uniform float _totalFactor;
uniform float _waveWidth;
uniform float _curWaveDis;
uniform float4 _startPos;
fixed4 frag(v2f_img i) : SV_Target
{
//DX下紋理坐標(biāo)反向問(wèn)題
#if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < 0)
_startPos.y = 1 - _startPos.y;
#endif
//計(jì)算uv到中間點(diǎn)的向量(向外擴(kuò),反過(guò)來(lái)就是向里縮)
float2 dv = _startPos.xy - i.uv;
//按照屏幕長(zhǎng)寬比進(jìn)行縮放
dv = dv * float2(_ScreenParams.x / _ScreenParams.y, 1);
//計(jì)算像素點(diǎn)距中點(diǎn)的距離
float dis = sqrt(dv.x * dv.x + dv.y * dv.y);
//用sin函數(shù)計(jì)算出波形的偏移值factor
//dis在這里都是小于1的,所以我們需要乘以一個(gè)比較大的數(shù),比如60,這樣就有多個(gè)波峰波谷
//sin函數(shù)是(-1,1)的值域,我們希望偏移值很小,所以這里我們縮小100倍,據(jù)說(shuō)乘法比較快,so...
float sinFactor = sin(dis * _distanceFactor + _Time.y * _timeFactor) * _totalFactor * 0.01;
//距離當(dāng)前波紋運(yùn)動(dòng)點(diǎn)的距離,如果小于waveWidth才予以保留,否則已經(jīng)出了波紋范圍,factor通過(guò)clamp設(shè)置為0
float discardFactor = clamp(_waveWidth - abs(_curWaveDis - dis), 0, 1) / _waveWidth;
//歸一化
float2 dv1 = normalize(dv);
//計(jì)算每個(gè)像素uv的偏移值
float2 offset = dv1 * sinFactor * discardFactor;
//像素采樣時(shí)偏移offset
float2 uv = offset + i.uv;
return tex2D(_MainTex, uv);
}
ENDCG
SubShader
{
Pass
{
ZTest Always
Cull Off
ZWrite Off
Fog { Mode off }
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
Fallback off
}
C#代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WaterWaveEffect : PostEffectsBase {
//距離系數(shù)
public float distanceFactor = 60.0f;
//時(shí)間系數(shù)
public float timeFactor = -30.0f;
//sin函數(shù)結(jié)果系數(shù)
public float totalFactor = 1.0f;
//波紋寬度
public float waveWidth = 0.3f;
//波紋擴(kuò)散的速度
public float waveSpeed = 0.3f;
private float waveStartTime;
private Vector4 startPos = new Vector4(0.5f, 0.5f, 0, 0);
public Material _Material;
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
//計(jì)算波紋移動(dòng)的距離,根據(jù)enable到目前的時(shí)間*速度求解
float curWaveDistance = (Time.time - waveStartTime) * waveSpeed;
//設(shè)置一系列參數(shù)
_Material.SetFloat("_distanceFactor", distanceFactor);
_Material.SetFloat("_timeFactor", timeFactor);
_Material.SetFloat("_totalFactor", totalFactor);
_Material.SetFloat("_waveWidth", waveWidth);
_Material.SetFloat("_curWaveDis", curWaveDistance);
_Material.SetVector("_startPos", startPos);
Graphics.Blit(source, destination, _Material);
}
void Update()
{
if (Input.GetMouseButton(0))
{
Vector2 mousePos = Input.mousePosition;
//將mousePos轉(zhuǎn)化為(0,1)區(qū)間
startPos = new Vector4(mousePos.x / Screen.width, mousePos.y / Screen.height, 0, 0);
waveStartTime = Time.time;
}
}
}
新建一個(gè)材質(zhì)球,選擇此shader,并賦值給這個(gè)腳本,點(diǎn)擊屏幕即可看到效果
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
winform中的ListBox和ComboBox綁定數(shù)據(jù)用法實(shí)例
這篇文章主要介紹了winform中的ListBox和ComboBox綁定數(shù)據(jù)用法,實(shí)例分析了將集合數(shù)據(jù)綁定到ListBox和ComboBox控件的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
一種c#深拷貝方式完勝java深拷貝(實(shí)現(xiàn)上的對(duì)比分析)
下面小編就為大家?guī)?lái)一篇一種c#深拷貝方式完勝java深拷貝(實(shí)現(xiàn)上的對(duì)比分析)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07
C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法
C# 中將數(shù)值型數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組的方法,需要的朋友可以參考一下2013-05-05
C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法
這篇文章主要介紹了C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法,可實(shí)現(xiàn)簡(jiǎn)單的文本加密功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12
C# 關(guān)于LoadLibrary的疑問(wèn)詳解
這篇文章主要介紹了C# 關(guān)于LoadLibrary的疑問(wèn)詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C#實(shí)現(xiàn)獲取多維數(shù)組的行數(shù)與列數(shù)
這篇文章主要為大家詳細(xì)介紹了C#如何分別使用Array.GetUpperBound方法和Array.GetLength方法實(shí)現(xiàn)獲取多維數(shù)組的行數(shù)與列數(shù),需要的可以參考下2024-02-02
C#應(yīng)用XML作為數(shù)據(jù)庫(kù)的快速開(kāi)發(fā)框架實(shí)現(xiàn)方法
這篇文章主要介紹了C#應(yīng)用XML作為數(shù)據(jù)庫(kù)的快速開(kāi)發(fā)框架實(shí)現(xiàn)方法,詳細(xì)介紹了將XML作為數(shù)據(jù)庫(kù)的C#桌面應(yīng)用開(kāi)發(fā)技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
C#通過(guò)WIN32 API實(shí)現(xiàn)嵌入程序窗體
這篇文章主要介紹了C#通過(guò)WIN32 API實(shí)現(xiàn)嵌入程序窗體的方法,涉及WIN32 API的調(diào)用及窗體的設(shè)計(jì),具有很好的借鑒價(jià)值,需要的朋友可以參考下2014-09-09

