Unity 旋转扭曲图像特效

旋转扭曲特效是指在一个圆形区域内扭曲所渲染的图像,其他像素的旋转程度随着距离的变化而变化。具体可以通过修改Shader来实现。

原始图片

扭曲图片
这里写图片描述

/*====================================================

                屏幕扭曲特效Shader

======================================================*/
Shader "Hidden/TwirlEffects"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}

    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            uniform sampler2D _MainTex;
            uniform float4    _MainTex_TexelSize;
            half4   _MainTex_ST;

            //旋转扭曲的中心
            uniform float4 _CenterRadius;
            //将旋转矩阵传入
            uniform float4x4 _RotationMatrix;

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

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

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                //将uv坐标变换到center坐标系中
                o.uv = v.uv - _CenterRadius.xy;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {

                float2 offest = i.uv;
                //利用旋转矩阵旋转uv
                float2 distortedOffset = MultiplyUV(_RotationMatrix,offest.xy);

                //计算uv点在旋转圆中的位置
                float2 tmp = offest / _CenterRadius.zw;
                float  t = min(1,length(tmp));

                //根据uv点在圆中的位置插值uv移动的位置
                offest =lerp(distortedOffset,offest,t);

                //将uv坐标返回原坐标系中
                offest += _CenterRadius.xy; 

                fixed4 col = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(offest, _MainTex_ST));

                return col;
            }
            ENDCG
        }
    }
}

此旋转特效主要就是对图像的uv值进行偏移,关键代码

                float2 offest = i.uv;
                //利用旋转矩阵旋转uv
                float2 distortedOffset = MultiplyUV(_RotationMatrix,offest.xy);

                //计算uv点在旋转圆中的位置
                float2 tmp = offest / _CenterRadius.zw;
                float  t = min(1,length(tmp));

                //根据uv点在圆中的位置插值uv移动的位置
                offest =lerp(distortedOffset,offest,t);

                //将uv坐标返回原坐标系中
                offest += _CenterRadius.xy; 

根据uv点的位置,对图像进行扭曲。

下面是脚本的源码

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

public class TwirlScripts : MonoBehaviour {

    [ExecuteInEditMode]

    public Vector2 radius = new Vector2(0.3f, 0.3f);

    public Vector2 center = new Vector2(0.5f, 0.5f);

    [Range(0.0f, 360.0f)]
    public float angle = 0.0f;

    public Material material;

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {

        Matrix4x4 rotationMatrix = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(0, 0, angle), Vector3.one);

        material.SetMatrix("_RotationMatrix", rotationMatrix);
        material.SetVector("_CenterRadius", new Vector4(center.x, center.y, radius.x, radius.y));

        Graphics.Blit(source, destination, material);

    }

}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值