Unity shader实现自由放大缩小效果

作者:clzmin 时间:2022-04-05 06:50:46 

本文实例为大家分享了Unity shader实现自由放大缩小效果的具体代码,供大家参考,具体内容如下

Unity shader实现自由放大缩小效果

代码:

以下实现的shader代码:


Shader "Hidden/Wave"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_WaveWidth("Wave Width",float) = 0.5
_CenterX("CenterX",float)=0.5
_CenterY("CenterY",float)=0.5
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always

Pass
{
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag

#include "UnityCG.cginc"

struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };

struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 vertex : SV_POSITION;
 };

float _WaveWidth;
 float _CenterX;
 float _CenterY;
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = UnityObjectToClipPos(v.vertex);
 o.uv = v.uv;
 return o;
 }

sampler2D _MainTex;

fixed4 frag (v2f i) : SV_Target
 {
 float2 center=float2(_CenterX,_CenterY);
 float2 distance= center - i.uv;
 float x=center.x+ center.x*(-distance.x/center.x) *(1-_WaveWidth);
 float y=center.y+ center.y*(-distance.y/center.y) *(1-_WaveWidth);
 float2 uv = float2(x,y);
 return tex2D(_MainTex, uv);  
 }
 ENDCG
}
}
}

主要的内容还是在frag中。

下面是挂在摄像机上的脚本:


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WaveCreame : MonoBehaviour {

public Shader waveShader = null;
 [Range(0.0f,1f)]
 public float waveWidth = 0.3f;
 private Material m_WaveMaterial = null;
 private float m_CenterX = 0.5f;
 private float m_CtenterY = 0.5f;
// Use this for initialization
void Start () {
   m_WaveMaterial = new Material(waveShader);
}

// Update is called once per frame
void Update () {
   Vector3 pos = Input.mousePosition;
   m_CenterX = pos.x / Screen.width;
   m_CtenterY = pos.y / Screen.height;
   if (Input.GetMouseButton(0)) {
     waveWidth += Time.deltaTime * 0.5f;
   }
   if (Input.GetMouseButton(1))
   {
     waveWidth -= Time.deltaTime * 0.5f;
   }
 }

private void OnRenderImage(RenderTexture source, RenderTexture destination)
 {
   if (waveShader == null || m_WaveMaterial == null) return;
   m_WaveMaterial.SetFloat("_WaveWidth", waveWidth);
   m_WaveMaterial.SetFloat("_CenterX", m_CenterX);
   m_WaveMaterial.SetFloat("_CenterY", m_CtenterY);
   Graphics.Blit(source, destination, m_WaveMaterial);
 }
}

来源:https://blog.csdn.net/clzmin/article/details/73696551

标签:Unity,shader,放大,缩小
0
投稿

猜你喜欢

  • Java编程二项分布的递归和非递归实现代码实例

    2023-08-07 09:38:04
  • Java的字符串中对子字符串的查找方法总结

    2022-12-16 17:16:31
  • java实现马踏棋盘的算法

    2023-11-29 17:00:29
  • java实现Socket通信之单线程服务

    2022-08-24 14:41:06
  • 关于Intellij IDEA中的Version Control问题

    2021-12-27 08:42:01
  • Java的“Goto”与标签及使用详解

    2023-11-11 03:56:09
  • Android中Spinner(下拉框)控件的使用详解

    2021-08-09 01:46:28
  • 使用 C# 下载文件的多种方法小结

    2023-11-08 06:59:37
  • springboot编程式事务TransactionTemplate的使用说明

    2022-03-01 15:19:37
  • 解决ThingsBoard编译报错问题:Failure to find org.gradle:gradle-tooling-api:jar:6.3

    2021-11-20 16:24:22
  • Ribbon单独使用,配置自动重试,实现负载均衡和高可用方式

    2023-05-12 00:49:15
  • Java中的守护线程问题

    2023-09-13 11:49:23
  • C#飞行棋小程序设计分析

    2023-06-05 05:27:24
  • Springboot集成ClickHouse及应用场景分析

    2022-04-02 16:28:46
  • 基于C#实现获取本地磁盘目录

    2021-08-21 12:51:43
  • Idea配置超详细图文教程(2020.2版本)

    2023-03-13 21:41:04
  • Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例

    2023-11-08 11:51:29
  • Android系统制作自定义签名的例子

    2023-02-02 05:10:04
  • jvm细节探索之synchronized及实现问题分析

    2023-08-24 02:13:29
  • 互斥量mutex的简单使用(实例讲解)

    2023-09-20 21:36:50
  • asp之家 软件编程 m.aspxhome.com