ImageEffects_Twirl(转)

Twirl是一个全屏画面扭曲的效果,新仙剑的战斗切换有用到这个效果。

主要有三个设置:

center扭曲的中心点

radius扭曲的范围

angle扭曲的角度

用到了如下函数

Matrix4x4.TRS(Vector3 pos, Quaternion rotate,Vector3 scale)

创建一个包括位移,旋转,缩放的矩阵

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

然后通过material的以下函数向shader里传参数

material.SetMatrix("name",value)对应Shader里的 float4x4

material.SetVector("name",value)对应Shader里的 float4

float2 MultiplyUV (float4x4 mat, float2 inUV) {

float4 temp = float4 (inUV.x, inUV.y, 0, 0);

temp = mul (mat, temp);

return temp.xy;

}

步骤:

脚本

(1) 通过Angle得到旋转矩阵

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

(2) 将矩阵和 旋转中点 及 半径传入shader.

Shader

(1) 将坐标系从左下角的坐标系 转到 以旋转中点为 原点的坐标系

vert里 o.uv = v.texcoord- _CenterRadius.xy;

(2) 将旋转坐标系 里的uv乘以 旋转矩阵。

(3) 将uv除以 半径, 再取长度。长度超过1则为 旋转区域外,小于则在区域内

(4) 如果在区域外,则为默认offset, 在内则是旋转后的offset

脚本

usingUnityEngine;

usingSystem.Collections;

public classTwirlEffectMe :MonoBehaviour{

public Shadershader;

private Materialmat;

public Vector2radius =new Vector2(0.3F,0.3F);

publicfloatangle =50;

public Vector2center =new Vector2(0.5F,0.5F);

voidStart()

{

mat =newMaterial(shader);

}

voidOnRenderImage (RenderTexturesource,RenderTexturedestination) {

RenderDistortion (mat, source, destination, angle, center, radius);

}

publicstaticvoidRenderDistortion(Materialmaterial,RenderTexturesource,RenderTexturedestination,floatangle,Vector2center,Vector2radius)

{

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

material.SetMatrix("_RotationMatrix", rotationMatrix);

material.SetVector("_CenterRadius",newVector4(center.x, center.y, radius.x, radius.y));

Graphics.Blit(source, destination, material);

}

}

Shader脚本

Shader"Custom/TwirlEffectMe"{

Properties{

_MainTex ("Base (RGB)",2D) ="white"{}

}

SubShader{

Pass{

ZTestAlwaysCullOffZWriteOff

Fog{Modeoff}

CGPROGRAM

#pragmavertex vert

#pragmafragment frag

#include"UnityCG.cginc"

uniformsampler2D_MainTex;

uniformfloat4_MainTex_TexelSize;

uniformfloat4_CenterRadius;

uniformfloat4x4_RotationMatrix;

structv2f {

float4pos : POSITION;

float2uv :TEXCOORD0;

} ;

v2f vert( appdata_img v )

{

v2f o;

o.pos =mul(UNITY_MATRIX_MVP, v.vertex);

o.uv = v.texcoord- _CenterRadius.xy;

returno;

}

float4frag (v2f i) :COLOR

{

float2offset= i.uv;

float2distortedOffset = MultiplyUV (_RotationMatrix,offset.xy);

float2tmp =offset/ _CenterRadius.zw;

float2finalUV;

floatlen =length(tmp);

// out of twirl

if( len >1)

{

finalUV =offset;

}

else

{

finalUV =distortedOffset;

}

// back to normal uv coordinate

finalUV += _CenterRadius.xy;

returntex2D(_MainTex, finalUV);

}

ENDCG

}

}

Fallbackoff

}

但是运行后,发现仅仅是简单旋转。需要再加上模糊。

分析一下,发现是由内向外从distortedOffset 渐渐向 正常offset过度的过程

于是将43行的finalUV =distortedOffset;改为

finalUV =lerp(distortedOffset,offset, len );

整体代码如下:

Shader"Custom/TwirlEffectMe"{

Properties{

_MainTex ("Base (RGB)",2D) ="white"{}

}

SubShader{

Pass{

ZTestAlwaysCullOffZWriteOff

Fog{Modeoff}

CGPROGRAM

#pragmavertex vert

#pragmafragment frag

#include"UnityCG.cginc"

uniform sampler2D_MainTex;

uniformfloat4_MainTex_TexelSize;

uniformfloat4_CenterRadius;

uniformfloat4x4_RotationMatrix;

structv2f {

float4pos : POSITION;

float2uv :TEXCOORD0;

} ;

v2f vert( appdata_img v )

{

v2f o;

o.pos =mul(UNITY_MATRIX_MVP, v.vertex);

o.uv = v.texcoord- _CenterRadius.xy;

returno;

}

float4frag (v2f i) :COLOR

{

float2offset= i.uv;

float2distortedOffset = MultiplyUV (_RotationMatrix,offset.xy);

float2tmp =offset/ _CenterRadius.zw;

float2finalUV;

floatlen =length(tmp);

// out of twirl

if( len >1)

{

finalUV =offset;

}

else

{

finalUV =lerp(distortedOffset,offset, len );

}

// back to normal uv coordinate

finalUV += _CenterRadius.xy;

returntex2D(_MainTex, finalUV);

}

ENDCG

}

}

Fallbackoff

}

点击运行,效果对了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容