服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - UnityShader3实现波浪效果

UnityShader3实现波浪效果

2022-07-09 09:20宏哥1995 C#

这篇文章主要为大家详细介绍了UnityShader3实现波浪效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了unityshader3实现波浪效果展示的具体代码,供大家参考,具体内容如下

参考链接: 【opengl】shader实例分析(一)-wave

效果图:

UnityShader3实现波浪效果

1.首先,实现格子背景图

?
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
shader "custom/curve"
{
 properties
 {
 _backgroundcolor ("backgroundcolor", color) = (1, 1, 1, 1)
 _backgroundcolor2 ("backgroundcolor2", color) = (0, 0, 0, 1)
 _space ("space", range(0, 1)) = 0.2
 _xoffset ("xoffset", range(-1, 1)) = 0.15
 _yoffset ("yoffset", range(-1, 1)) = 0.05
 }
 subshader
 {
 pass
 {
 cgprogram
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"
 
 struct appdata
 {
 float4 vertex : position;
 float2 uv : texcoord0;
 };
 
 struct v2f
 {
 float4 vertex : sv_position;
 float2 uv : texcoord0;
 };
 
 //格子背景
 fixed4 _backgroundcolor;
 fixed4 _backgroundcolor2;
 fixed _space;
 fixed _xoffset;
 fixed _yoffset;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(unity_matrix_mvp, v.vertex);
 o.uv = v.uv;
 
 return o;
 }
 
 fixed4 frag (v2f i) : sv_target
 {
 //fmod(x, y):x/y的余数,和x有同样的符号
 //step(a, x):如果x<a,返回0;如果x>=a,返回1
 
 //得到一个小于_space的余数,即a的范围为[0, _space)
 fixed a = fmod(i.uv.x + _xoffset, _space);
 //有1/2概率返回0,有1/2概率返回1,从而形成间隔效果
 a = step(0.5 * _space, a);
 
 fixed b = fmod(i.uv.y + _yoffset, _space);
 b = step(0.5 * _space, b);
 
 return _backgroundcolor * a * b + _backgroundcolor2 * (1 - a * b);
 }
 endcg
 }
 }
}

UnityShader3实现波浪效果

2.在中间添加一条直线

?
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
shader "custom/curve"
{
 properties
 {
 _backgroundcolor ("backgroundcolor", color) = (1, 1, 1, 1)
 _backgroundcolor2 ("backgroundcolor2", color) = (0, 0, 0, 1)
 _space ("space", range(0, 1)) = 0.2
 _xoffset ("xoffset", range(-1, 1)) = 0.15
 _yoffset ("yoffset", range(-1, 1)) = 0.05
 }
 subshader
 {
 pass
 {
 cgprogram
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"
 
 struct appdata
 {
 float4 vertex : position;
 float2 uv : texcoord0;
 };
 
 struct v2f
 {
 float4 vertex : sv_position;
 float2 uv : texcoord0;
 };
 
 //格子背景
 fixed4 _backgroundcolor;
 fixed4 _backgroundcolor2;
 fixed _space;
 fixed _xoffset;
 fixed _yoffset;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(unity_matrix_mvp, v.vertex);
 o.uv = v.uv;
 
 return o;
 }
 
 fixed4 frag (v2f i) : sv_target
 {
 //fmod(x, y):x/y的余数,和x有同样的符号
 //step(a, x):如果x<a,返回0;如果x>=a,返回1
 
 //得到一个小于_space的余数,即a的范围为[0, _space)
 fixed a = fmod(i.uv.x + _xoffset, _space);
 //有1/2概率返回0,有1/2概率返回1,从而形成间隔效果
 a = step(0.5 * _space, a);
 
 fixed b = fmod(i.uv.y + _yoffset, _space);
 b = step(0.5 * _space, b);
 
 fixed4 bgcol = _backgroundcolor * a * b + _backgroundcolor2 * (1 - a * b);
 
 
 //范围(1, 51),乘上100是扩大差距(中间最亮其他两边基本不亮),加上1是防止0作为除数,同时确保最中间最亮
 float v = abs(i.uv.y - 0.5) * 100 + 1;
 v = 1 / v;
 fixed4 linecol = fixed4(v, v, v, 1);
 
 return bgcol + linecol;
 }
 endcg
 }
 }
}

UnityShader3实现波浪效果

3.直线变曲线

?
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
81
82
83
84
85
86
shader "custom/curve"
{
 properties
 {
 //调整背景
 _backgroundcolor ("backgroundcolor", color) = (1, 1, 1, 1)
 _backgroundcolor2 ("backgroundcolor2", color) = (0, 0, 0, 1)
 _space ("space", range(0, 1)) = 0.2
 _xoffset ("xoffset", range(-1, 1)) = 0.15
 _yoffset ("yoffset", range(-1, 1)) = 0.05
 
 //调整曲线的波动
 _frequency ("frequency", range(0, 100)) = 10//频率
 _amplitude ("amplitude", range(0, 1)) = 0.1//振幅
 _speed ("speed", range(0, 100)) = 10//速度
 }
 subshader
 {
 pass
 {
 cgprogram
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"
 
 struct appdata
 {
 float4 vertex : position;
 float2 uv : texcoord0;
 };
 
 struct v2f
 {
 float4 vertex : sv_position;
 float2 uv : texcoord0;
 };
 
 //格子背景
 fixed4 _backgroundcolor;
 fixed4 _backgroundcolor2;
 fixed _space;
 fixed _xoffset;
 fixed _yoffset;
 
 half _frequency;
 half _amplitude;
 half _speed;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(unity_matrix_mvp, v.vertex);
 o.uv = v.uv;
 
 return o;
 }
 
 fixed4 frag (v2f i) : sv_target
 {
 //fmod(x, y):x/y的余数,和x有同样的符号
 //step(a, x):如果x<a,返回0;如果x>=a,返回1
 
 //得到一个小于_space的余数,即a的范围为[0, _space)
 fixed a = fmod(i.uv.x + _xoffset, _space);
 //有1/2概率返回0,有1/2概率返回1,从而形成间隔效果
 a = step(0.5 * _space, a);
 
 fixed b = fmod(i.uv.y + _yoffset, _space);
 b = step(0.5 * _space, b);
 
 fixed4 bgcol = _backgroundcolor * a * b + _backgroundcolor2 * (1 - a * b);
 
 
 //范围(1, 51),乘上100是扩大差距(中间最亮其他两边基本不亮),加上1是防止0作为除数,同时确保最中间最亮
 //float y = i.uv.y + sin(_time.y);扫描线效果
 float y = i.uv.y + sin(i.uv.x * _frequency + _time.y * _speed) * _amplitude;//可以看成一条y的关于x的方程式
 float v = abs(y - 0.5) * 100 + 1;
 v = 1 / v;
 fixed4 linecol = fixed4(v, v, v, 1);
 
 return bgcol + linecol;
 }
 endcg
 }
 }
}

UnityShader3实现波浪效果

注释掉的是扫描线效果:

UnityShader3实现波浪效果

4.多曲线。其实就是for循环,然后在频率和振幅上加些变量,即可形成多条不同的曲线。

?
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
81
82
83
84
85
86
87
88
89
90
91
92
93
shader "custom/curve"
{
 properties
 {
 //调整背景
 _backgroundcolor ("backgroundcolor", color) = (1, 1, 1, 1)
 _backgroundcolor2 ("backgroundcolor2", color) = (0, 0, 0, 1)
 _space ("space", range(0, 1)) = 0.2
 _xoffset ("xoffset", range(-1, 1)) = 0.15
 _yoffset ("yoffset", range(-1, 1)) = 0.05
 
 //调整曲线的波动
 _frequency ("frequency", range(0, 100)) = 10//频率
 _amplitude ("amplitude", range(0, 1)) = 0.1//振幅
 _speed ("speed", range(0, 100)) = 10//速度
 }
 subshader
 {
 pass
 {
 cgprogram
 #pragma vertex vert
 #pragma fragment frag
 #include "unitycg.cginc"
 
 struct appdata
 {
 float4 vertex : position;
 float2 uv : texcoord0;
 };
 
 struct v2f
 {
 float4 vertex : sv_position;
 float2 uv : texcoord0;
 };
 
 //格子背景
 fixed4 _backgroundcolor;
 fixed4 _backgroundcolor2;
 fixed _space;
 fixed _xoffset;
 fixed _yoffset;
 
 half _frequency;
 half _amplitude;
 half _speed;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = mul(unity_matrix_mvp, v.vertex);
 o.uv = v.uv;
 
 return o;
 }
 
 fixed4 frag (v2f i) : sv_target
 {
 //fmod(x, y):x/y的余数,和x有同样的符号
 //step(a, x):如果x<a,返回0;如果x>=a,返回1
 
 //得到一个小于_space的余数,即a的范围为[0, _space)
 fixed a = fmod(i.uv.x + _xoffset, _space);
 //有1/2概率返回0,有1/2概率返回1,从而形成间隔效果
 a = step(0.5 * _space, a);
 
 fixed b = fmod(i.uv.y + _yoffset, _space);
 b = step(0.5 * _space, b);
 
 fixed4 bgcol = _backgroundcolor * a * b + _backgroundcolor2 * (1 - a * b);
 
 
 //范围(1, 51),乘上100是扩大差距(中间最亮其他两边基本不亮),加上1是防止0作为除数,同时确保最中间最亮
 //float y = i.uv.y + sin(_time.y);扫描线效果
 
 fixed4 linecol;
 
 for(int count = 0;count < 3;count++)
 {
  float y = i.uv.y + sin(i.uv.x * _frequency * count * 0.1 + _time.y * _speed) * (_amplitude + count * 0.1);//可以看成一条y的关于x的方程式
  y = saturate(y);//重新映射到(0, 1)范围
  float v = abs(y - 0.5) * 100 + 1;
  v = 1 / v;
  linecol += fixed4(v, v, v, 1);//注意是"+"操作,对颜色进行叠加
 }
 
 return bgcol + linecol;
 }
 endcg
 }
 }
}

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

原文链接:https://blog.csdn.net/lyh916/article/details/51880609

延伸 · 阅读

精彩推荐
  • C#C#多线程ThreadPool线程池详解

    C#多线程ThreadPool线程池详解

    这篇文章主要为大家详细介绍了C#多线程ThreadPool线程池的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    linYongJie4862022-01-12
  • C#C#中static void Main(string[] args) 参数示例详解

    C#中static void Main(string[] args) 参数示例详解

    这篇文章主要介绍了C#中static void Main(string[] args) 参数详解,本文通过具体示例给大家介绍的非常详细,需要的朋友可以参考下...

    SavionZhang9422021-12-29
  • C#C# 设计模式系列教程-原型模式

    C# 设计模式系列教程-原型模式

    原型模式隐藏了对象的创建细节,对有些初始化需要占用很多资源的类来说,对性能也有很大提高。...

    Wang Juqiang6492021-11-23
  • C#使用C#语言实现的查询条件界面展开和收起功能

    使用C#语言实现的查询条件界面展开和收起功能

    这篇文章主要介绍了使用C#语言实现的查询条件界面展开和收起功能的完美解决方案,需要的朋友可以参考下...

    北风其凉11442021-12-10
  • C#C#中out参数、ref参数与值参数的用法及区别

    C#中out参数、ref参数与值参数的用法及区别

    这篇文章主要给大家介绍了关于C#中out参数、ref参数与值参数的用法及区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一...

    yixuan.han7822022-02-28
  • C#C# httpwebrequest访问HTTPS错误处理方法

    C# httpwebrequest访问HTTPS错误处理方法

    下面小编就为大家带来一篇C# httpwebrequest访问HTTPS错误处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C#教程网4432021-12-22
  • C#C#删除UL LI中指定标签里文字的方法

    C#删除UL LI中指定标签里文字的方法

    这篇文章主要介绍了C#删除UL LI中指定标签里文字的方法,涉及C#针对页面HTML元素进行正则匹配与替换的相关操作技巧,需要的朋友可以参考下...

    蓝色水7242022-01-06
  • C#浅析C#中结构与类的区别

    浅析C#中结构与类的区别

    本文主要对C#结构与类的区别进行简要分析,文中举了实例,便于理解,具有很好的参考价值,需要的朋友一起来看下吧...

    反骨仔(二五仔)10652021-12-15