Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效
旋轉(zhuǎn)扭曲特效是指在一個(gè)圓形區(qū)域內(nèi)扭曲所渲染的圖像,其他像素的旋轉(zhuǎn)程度隨著距離的變化而變化。具體可以通過(guò)修改Shader來(lái)實(shí)現(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坐標(biāo)變換到center坐標(biāo)系中
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);
//計(jì)算uv點(diǎn)在旋轉(zhuǎn)圓中的位置
float2 tmp = offest / _CenterRadius.zw;
float t = min(1,length(tmp));
//根據(jù)uv點(diǎn)在圓中的位置插值uv移動(dòng)的位置
offest =lerp(distortedOffset,offest,t);
//將uv坐標(biāo)返回原坐標(biāo)系中
offest += _CenterRadius.xy;
fixed4 col = tex2D(_MainTex, UnityStereoScreenSpaceUVAdjust(offest, _MainTex_ST));
return col;
}
ENDCG
}
}
}
此旋轉(zhuǎn)特效主要就是對(duì)圖像的uv值進(jìn)行偏移,關(guān)鍵代碼
float2 offest = i.uv; //利用旋轉(zhuǎn)矩陣旋轉(zhuǎn)uv float2 distortedOffset = MultiplyUV(_RotationMatrix,offest.xy); //計(jì)算uv點(diǎn)在旋轉(zhuǎn)圓中的位置 float2 tmp = offest / _CenterRadius.zw; float t = min(1,length(tmp)); //根據(jù)uv點(diǎn)在圓中的位置插值uv移動(dòng)的位置 offest =lerp(distortedOffset,offest,t); //將uv坐標(biāo)返回原坐標(biāo)系中 offest += _CenterRadius.xy;
根據(jù)uv點(diǎn)的位置,對(duì)圖像進(jìn)行扭曲。
下面是腳本的源碼
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);
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Unity 從UI中拖拽對(duì)象放置并拖動(dòng)效果 附demo
- Unity UGUI實(shí)現(xiàn)簡(jiǎn)單拖拽圖片功能
- Unity工具類ScrollView實(shí)現(xiàn)拖拽滑動(dòng)翻頁(yè)
- Unity UI拖拽模型選擇功能
- Unity3D實(shí)現(xiàn)物體旋轉(zhuǎn)縮放移動(dòng)效果
- Unity向量按照某一點(diǎn)進(jìn)行旋轉(zhuǎn)
- Unity實(shí)現(xiàn)物體沿自身的任意軸向旋轉(zhuǎn)
- Unity實(shí)現(xiàn)人物旋轉(zhuǎn)和移動(dòng)效果
- Unity實(shí)現(xiàn)繞任意軸任意角度旋轉(zhuǎn)向量
- Unity UI實(shí)現(xiàn)拖拽旋轉(zhuǎn)
相關(guān)文章
Unity?UGUI的CanvasScaler畫(huà)布縮放器組件介紹使用
這篇文章主要為大家介紹了Unity?UGUI的CanvasScaler畫(huà)布縮放器組件介紹使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題
這篇文章主要介紹了C#關(guān)于Textbox滾動(dòng)顯示最后一行,不閃爍問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
C#中驗(yàn)證sql語(yǔ)句是否正確(不執(zhí)行語(yǔ)句)
C#中驗(yàn)證sql語(yǔ)句是否正確(不執(zhí)行語(yǔ)句),需要的朋友可以參考一下2013-03-03

