Unity Shader实现水波纹效果

本文实例为大家分享了Unity Shader实现水波纹的具体代码,供大家参考,具体内容如下

效果:

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下纹理坐标反向问题
  #if UNITY_UV_STARTS_AT_TOP
  if (_MainTex_TexelSize.y < 0)
   _startPos.y = 1 - _startPos.y;
  #endif
  //计算uv到中间点的向量(向外扩,反过来就是向里缩)
  float2 dv = _startPos.xy - i.uv;
  //按照屏幕长宽比进行缩放
  dv = dv * float2(_ScreenParams.x / _ScreenParams.y, 1);
  //计算像素点距中点的距离
  float dis = sqrt(dv.x * dv.x + dv.y * dv.y);
  //用sin函数计算出波形的偏移值factor
  //dis在这里都是小于1的,所以我们需要乘以一个比较大的数,比如60,这样就有多个波峰波谷
  //sin函数是(-1,1)的值域,我们希望偏移值很小,所以这里我们缩小100倍,据说乘法比较快,so...
  float sinFactor = sin(dis * _distanceFactor + _Time.y * _timeFactor) * _totalFactor * 0.01;
  //距离当前波纹运动点的距离,如果小于waveWidth才予以保留,否则已经出了波纹范围,factor通过clamp设置为0
  float discardFactor = clamp(_waveWidth - abs(_curWaveDis - dis), 0, 1) / _waveWidth;
  //归一化
  float2 dv1 = normalize(dv);
  //计算每个像素uv的偏移值
  float2 offset = dv1 * sinFactor * discardFactor;
  //像素采样时偏移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 {
 //距离系数
 public float distanceFactor = 60.0f;
 //时间系数
 public float timeFactor = -30.0f;
 //sin函数结果系数
 public float totalFactor = 1.0f;

 //波纹宽度
 public float waveWidth = 0.3f;
 //波纹扩散的速度
 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)
 {
  //计算波纹移动的距离,根据enable到目前的时间*速度求解
  float curWaveDistance = (Time.time - waveStartTime) * waveSpeed;
  //设置一系列参数
  _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转化为(0,1)区间
   startPos = new Vector4(mousePos.x / Screen.width, mousePos.y / Screen.height, 0, 0);
   waveStartTime = Time.time;
  }

 }
}

新建一个材质球,选择此shader,并赋值给这个脚本,点击屏幕即可看到效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • unity实现透明水波纹扭曲

    本文实例为大家分享了unity实现透明水波纹扭曲的具体代码,供大家参考,具体内容如下 需要挂一个摄像机把脚本挂在一个物体上 可随意在物体上面点击 shader: Shader "Unlit/Water" { Properties { _MainTex ("Texture", 2D) = "white" {} _WaterUV("WaterUV",2D)="while"{} _WaterIntensity(&

  • Unity Shader实现2D水流效果

    水流的模拟主要运用了顶点变换和纹理动画的结合: 顶点变换中,利用正弦函数模拟河流的大致形态,例如波长,振幅等. 纹理动画中,将纹理坐标朝某一方向持续滚动以形成流动的效果. 脚本如下: Shader "MyUnlit/ScrollWater" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color("Color Tint",color)=(1,1,1,1) //控制

  • Unity Shader实现水墨效果

    Unity Shader学习:水墨效果 偶然在网上看到9级铁甲蛹大神的水墨风格后处理觉得挺有意思,参照着实现一下,还是涉及到之前油画效果的算法,叫什么滤波暂时不清楚,应该用来处理手绘效果挺多的. 水墨风格基本原理:高斯模糊原始图像,用深度算出边缘进行描边,最后用画笔效果的滤波完成最终图像. 有需要可以用Post Proces改变颜色范围,更接近水墨的颜色. C#部分: //屏幕后处理基类 using UnityEngine; using System.Collections; //非运行时也触发

  • Unity Shader实现水波纹效果

    本文实例为大家分享了Unity Shader实现水波纹的具体代码,供大家参考,具体内容如下 效果: Shader代码: Shader "Custom/shuibowen"{ Properties{ _MainTex("Base (RGB)",2D)="white"{} _distanceFactor("Distancefactor",float)=1 _timeFactor("time factor",fl

  • Android实现水波纹效果

    一.效果 点击开始: 点击停止: 二.在MainActivity中 import android.graphics.Paint; import android.os.Bundle; import android.support.v4.view.animation.LinearOutSlowInInterpolator; import android.support.v7.app.AppCompatActivity; import android.view.View; import android

  • Android实现自定义华丽的水波纹效果

    先来看看效果 实现效果 模拟水波纹的效果:点击屏幕就有圆环出现,半径从小到大,透明度从大到小(0为透明) 实现思路 1.自定义类继承View. 2.定义每个圆环的实体类 Wave,并初始化绘制圆环的画笔的数据. 3.重写onTouchEvent方法,down时,获得坐标点,做为圆环圆心. 4.发送handler信息,对数据进行修改,刷新页面. 5.重写onDraw方法,绘制一个圆环. 1. 自定义类继承View 新建WaterWaveView2类继承View public class Water

  • Android中Item实现点击水波纹效果

    前言 水波纹效果大致上可以分为两类,一类是有界水波纹,而另一类是无界水波纹,较为广泛使用的是有界水波纹. 系统自带的水波纹实现 系统自带的方法非常方便,只需要给相应的空间设置背景,背景内容则为系统自带的 selectableItemBackground ,这样的话,水波纹就会在TextView所在的区域内进行绘制. <TextView android:background="?android:attr/selectableItemBackground" ... /> 先上效

  • C语言实现水波纹效果

    本文实例为大家分享了C语言实现水波纹效果的具体代码,供大家参考,具体内容如下 #include <graphics.h> #include <conio.h> #include <stdio.h> #define PIC_HEIGHT 600 #define PIC_WIDTH 800 void FrameFun(); // 帧逻辑函数,处理每一帧的逻辑 void RenderFun(); // 帧渲染函数,输出每一帧到显示设备 IMAGE src_img; // 原位

  • Android5.0中多种水波纹效果的实现代码

    水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来看看这个水波纹效果的实现.水波纹效果的实现有系统自带属性可以实现,我们也可以自定义实现效果. 1.系统自带水波纹实现方式 有界水波纹 水波纹效果大致上可以分为两种,一种是有界的,一种无界,我们先来看看有界水波纹效果: 效果: 代码: <TextView android:layout_width=&quo

  • Android自定义控件实现水波纹效果

    本文实例为大家分享了Android自定义控件实现水波纹的具体代码,供大家参考,具体内容如下 示例代码: MainActivity.java package com.example.mhy.shuibowen; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protec

  • Android实现简单水波纹效果

    本文为大家分享了Android实现水波纹效果展示的具体代码,供大家参考,具体内容如下 一.效果 二.实现原理 自定义view,使用Path和贝塞尔曲线绘制,然后不断刷新,并且改变X.Y的值 主要知识点rQuadTo的使用 三.实现 WaveView.java public class WaveView extends View { private Paint mPaint; private final Path mPath; //波长 private int wavelength = 500;

  • js拖动滑块和点击水波纹效果实例代码

    拖动滑块效果: 先看看效果图: <!doctype html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <t

随机推荐