首页 > 编程 > C# > 正文

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

2020-01-24 00:09:00
字体:
来源:转载
供稿:网友

本文实例为大家分享了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);  }}

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表