Unity实现旋转扭曲图像特效

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

原始图片

扭曲图片

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

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

屏幕扭曲特效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值进行偏移,关键代码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

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点的位置,对图像进行扭曲。

下面是脚本的源码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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);

}

}

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

原文链接:https://blog.csdn.net/u014222099/article/details/54377229

本文链接:https://my.lmcjl.com/post/8886.html

展开阅读全文

4 评论

留下您的评论.