首页 > 编程 > C# > 正文

Unity实现旋转扭曲图像特效

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

旋转扭曲特效是指在一个圆形区域内扭曲所渲染的图像,其他像素的旋转程度随着距离的变化而变化。具体可以通过修改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);  }}

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

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