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

来源:互联网 发布:jquery.downcount.js 编辑:程序博客网 时间:2024/05/14 03:18


以下实现的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 depthCull Off ZWrite Off ZTest AlwaysPass{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 initializationvoid Start () {        m_WaveMaterial = new Material(waveShader);}// Update is called once per framevoid 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);    }}


阅读全文
1 0
原创粉丝点击