Unity實現(xiàn)旋轉(zhuǎn)扭曲圖像特效
更新時間:2020年04月17日 11:53:33 作者:圖形小菜雞
這篇文章主要為大家詳細介紹了Unity實現(xiàn)旋轉(zhuǎn)扭曲圖像特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
旋轉(zhuǎn)扭曲特效是指在一個圓形區(qū)域內(nèi)扭曲所渲染的圖像,其他像素的旋轉(zhuǎn)程度隨著距離的變化而變化。具體可以通過修改Shader來實現(xiàn)。
原始圖片

扭曲圖片

/*====================================================
屏幕扭曲特效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;
//旋轉(zhuǎn)扭曲的中心
uniform float4 _CenterRadius;
//將旋轉(zhuǎn)矩陣傳入
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;
//利用旋轉(zhuǎn)矩陣旋轉(zhuǎn)uv
float2 distortedOffset = MultiplyUV(_RotationMatrix,offest.xy);
//計算uv點在旋轉(zhuǎn)圓中的位置
float2 tmp = offest / _CenterRadius.zw;
float t = min(1,length(tmp));
//根據(jù)uv點在圓中的位置插值uv移動的位置
offest =lerp(distortedOffset,offest,t);
//將uv坐標返回原坐標系中
offest += _CenterRadius.xy;
fixed4 col = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(offest, _MainTex_ST));
return col;
}
ENDCG
}
}
}
此旋轉(zhuǎn)特效主要就是對圖像的uv值進行偏移,關(guān)鍵代碼
float2 offest = i.uv; //利用旋轉(zhuǎn)矩陣旋轉(zhuǎn)uv float2 distortedOffset = MultiplyUV(_RotationMatrix,offest.xy); //計算uv點在旋轉(zhuǎn)圓中的位置 float2 tmp = offest / _CenterRadius.zw; float t = min(1,length(tmp)); //根據(jù)uv點在圓中的位置插值uv移動的位置 offest =lerp(distortedOffset,offest,t); //將uv坐標返回原坐標系中 offest += _CenterRadius.xy;
根據(jù)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);
}
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的CanvasScaler畫布縮放器組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
C#關(guān)于Textbox滾動顯示最后一行,不閃爍問題
這篇文章主要介紹了C#關(guān)于Textbox滾動顯示最后一行,不閃爍問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04

