开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2173

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2710|回复: 35

[慕容小匹夫] 小随笔:利用Shader给斯坦福兔子长毛和实现雪地效果

[复制链接]  [移动端链接]
排名
2021
昨日变化

46

主题

289

帖子

2969

积分

Rank: 9Rank: 9Rank: 9

UID
44527
好友
55
蛮牛币
2485
威望
0
注册时间
2014-9-12
在线时间
555 小时
最后登录
2018-3-28

专栏作家活力之星认证开发者

发表于 2017-12-27 22:56:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
0x00 前言
发现最近没有了写长篇大论的激情,可能是到了冬天了吧。所以这篇小文只是简单介绍下如何在Unity中利用shader很简单的实现雪地效果以及毛皮效果,当然虽然标题写在了一起,但其实这是俩事。
最后和大家分享一下这两个小Demo。
0x01 斯坦福兔子和它的毛
我相信对图形学有兴趣的童靴们一定经常会见到这个上镜率超高的兔子。

关于它的典故各位可以看看龚大的回答:斯坦福兔子模型的来源和故事有哪些?
当然,我用的兔子也是从斯坦福的网站上找到的。
https://graphics.stanford.edu/~mdfisher/Data/Meshes/bunny.obj
ok,导入到我们的Unity引擎中。

可以看到这个丑丑的兔子已经端坐在场景内了。
接下来就开始我们对兔子的改造行动吧。
既然要生成皮毛,那么是否需要皮毛的网格数据呢?是的。
那么皮毛的网格要根据什么来生成呢?
要生在兔子的身体上,所以兔子的原始网格信息提供了皮毛的网格信息。
ok,那么具体要怎么做呢?很简单,Geometry Shader就是干这个的。而我们只需要根据兔子的网格信息,以每一个triangle为一个单位,在这个triangle上生成一个向外指的“金字塔”就可以了。

也就是说,在原有triangle的基础上又新生成了3个指向外面的triangle,形成毛皮的效果。
        [maxvertexcount(9)]        void geom(triangle v2g IN[3], inout TriangleStream<g2f> tristream)        {            g2f o;            ...            for (uint i = 0; i < 3; i++)            {                o.vertex = UnityObjectToClipPos(IN.vertex);                tristream.Append(o);                o.vertex = UnityObjectToClipPos(IN[index].vertex);                tristream.Append(o);                o.vertex = UnityObjectToClipPos(float4(centerPos, 1));                tristream.Append(o);                tristream.RestartStrip();            }        }
因此总共会生成9个顶点,3个新三角形共同组成一跟毛。
Demo地址:chenjd/Stanford-Bunny-Fur-With-Unity
0x02 雪地痕迹的效果
实现雪地印痕的思路其实也很简单,即记录玩家移动过程中的位置,之后再根据这些数据修改雪地的mesh即可。
所以,很简单的,我们在unity中只需要一个在玩家头顶上的正交相机和一个rendertexture就可以记录玩家的移动过程中的位置了。
之后在shader文件中先用vs根据rendertexture的数据修改雪地mesh的相关顶点位置,同时为了更方便地实现光照的效果,接下来使用surface shader,实现光照。
    void vert(inout appdata_full vertex)    {        vertex.vertex.y -= tex2Dlod(_SnowTrackTex, float4(vertex.texcoord.xy, 0, 0)).r * _SnowTrackFactor;    }    void surf (Input IN, inout SurfaceOutputStandard o) {        fixed4 c = tex2D(_MainTex, IN.uv_MainTex);        o.Albedo = c.rgb;        o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex));        o.Alpha = c.a;    }
好了,最后的效果就是下面这样的。

Demo地址:chenjd/Unity-Miscellaneous-Shaders
0x03 后记
当然,如果有更多的三角形以上效果会更加真实精细。所以有时候会搭配Tessellation的处理,提供更多的三角形,提供更多的精确性。
-EOF-
最后打个广告,欢迎支持我的书《Unity 3D脚本编程》
https://item.jd.com/12035114.html


回复

使用道具 举报

7日久生情
2531/5000
排名
3277
昨日变化
2

2

主题

1781

帖子

2531

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10185
威望
0
注册时间
2017-9-6
在线时间
359 小时
最后登录
2018-4-20
发表于 2017-12-28 08:15:23 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

4四处流浪
426/500
排名
6515
昨日变化
53

0

主题

126

帖子

426

积分

Rank: 4

UID
254155
好友
0
蛮牛币
526
威望
0
注册时间
2017-11-13
在线时间
120 小时
最后登录
2018-4-20
发表于 2017-12-28 09:52:26 | 显示全部楼层
之前只知乎上就读过这篇文章。
[发帖际遇]: 秩亦 发帖时在路边捡到 1 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

5熟悉之中
965/1000
排名
4230
昨日变化
27

0

主题

422

帖子

965

积分

Rank: 5Rank: 5

UID
182268
好友
2
蛮牛币
907
威望
0
注册时间
2016-11-9
在线时间
247 小时
最后登录
2018-4-20
发表于 2017-12-28 09:57:50 | 显示全部楼层
[发帖际遇]: 15910553283 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
613/1000
排名
4946
昨日变化
24

0

主题

201

帖子

613

积分

Rank: 5Rank: 5

UID
228538
好友
2
蛮牛币
799
威望
0
注册时间
2017-6-24
在线时间
162 小时
最后登录
2018-4-20
发表于 2017-12-28 10:09:36 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
545/1000
排名
3844
昨日变化
1

0

主题

72

帖子

545

积分

Rank: 5Rank: 5

UID
52730
好友
1
蛮牛币
890
威望
0
注册时间
2014-11-3
在线时间
145 小时
最后登录
2018-4-14
发表于 2017-12-28 10:20:53 | 显示全部楼层
好文章,谢谢啦。

回复

使用道具 举报

4四处流浪
417/500
排名
10735
昨日变化
9

3

主题

84

帖子

417

积分

Rank: 4

UID
190325
好友
1
蛮牛币
368
威望
0
注册时间
2016-12-7
在线时间
251 小时
最后登录
2018-4-20
发表于 2017-12-28 10:22:15 | 显示全部楼层
书已买,感觉不错,讲的比较深入,有用!

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1304/1500
排名
1598
昨日变化
1

1

主题

130

帖子

1304

积分

Rank: 6Rank: 6Rank: 6

UID
186029
好友
1
蛮牛币
2187
威望
0
注册时间
2016-11-22
在线时间
465 小时
最后登录
2018-4-20
发表于 2017-12-28 10:56:03 | 显示全部楼层
感谢分享

回复

使用道具 举报

5熟悉之中
713/1000
排名
4536
昨日变化
4

1

主题

69

帖子

713

积分

Rank: 5Rank: 5

UID
39599
好友
2
蛮牛币
842
威望
0
注册时间
2014-8-13
在线时间
269 小时
最后登录
2018-4-18

蛮牛译员

发表于 2017-12-28 11:24:44 | 显示全部楼层
膜拜大神

回复

使用道具 举报

7日久生情
2239/5000
排名
18451
昨日变化
9

2

主题

1863

帖子

2239

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
185807
好友
0
蛮牛币
2927
威望
0
注册时间
2016-11-22
在线时间
350 小时
最后登录
2018-4-18
发表于 2017-12-28 14:34:18 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

4四处流浪
366/500
排名
12093
昨日变化
15

3

主题

132

帖子

366

积分

Rank: 4

UID
216830
好友
2
蛮牛币
232
威望
0
注册时间
2017-4-9
在线时间
168 小时
最后登录
2018-4-17
发表于 2017-12-28 17:25:14 | 显示全部楼层
谢谢分享
[发帖际遇]: 一个袋子砸在了 wx_Zh7tc9i4 头上,wx_Zh7tc9i4 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1303/1500
排名
1042
昨日变化
2

1

主题

48

帖子

1303

积分

Rank: 6Rank: 6Rank: 6

UID
100193
好友
1
蛮牛币
3060
威望
0
注册时间
2015-5-14
在线时间
320 小时
最后登录
2018-1-11
发表于 2017-12-28 17:59:45 | 显示全部楼层
GS运算开销很大,不知道是不是真的。用细分着色器可以吗

回复 支持 反对

使用道具 举报

5熟悉之中
501/1000
排名
7605
昨日变化
81

0

主题

260

帖子

501

积分

Rank: 5Rank: 5

UID
250350
好友
1
蛮牛币
430
威望
0
注册时间
2017-10-23
在线时间
103 小时
最后登录
2018-4-19
发表于 2017-12-28 18:32:31 | 显示全部楼层
感谢分享

回复

使用道具 举报

3偶尔光临
203/300
排名
10173
昨日变化
7

0

主题

50

帖子

203

积分

Rank: 3Rank: 3Rank: 3

UID
260747
好友
0
蛮牛币
217
威望
0
注册时间
2017-12-23
在线时间
65 小时
最后登录
2018-4-20
发表于 2017-12-28 19:00:43 | 显示全部楼层
看着还不错

回复

使用道具 举报

4四处流浪
352/500
排名
5925
昨日变化
45

0

主题

30

帖子

352

积分

Rank: 4

UID
226019
好友
0
蛮牛币
293
威望
0
注册时间
2017-6-9
在线时间
124 小时
最后登录
2018-4-20
发表于 2017-12-28 20:01:42 | 显示全部楼层
感谢分享

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表