1. 程式人生 > >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);
    }
}