游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2260

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

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

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

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

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

52

主题

295

帖子

3034

积分

Rank: 9Rank: 9Rank: 9

UID
44527
好友
60
蛮牛币
2607
威望
0
注册时间
2014-9-12
在线时间
576 小时
最后登录
2018-7-16

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

发表于 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日久生情
2535/5000
排名
3453
昨日变化
2

2

主题

1780

帖子

2535

积分

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

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

回复

使用道具 举报

5熟悉之中
655/1000
排名
4389
昨日变化

0

主题

151

帖子

655

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1244/1500
排名
3239
昨日变化
17

0

主题

511

帖子

1244

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

5熟悉之中
827/1000
排名
3722
昨日变化
2

0

主题

248

帖子

827

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
554/1000
排名
3959
昨日变化
3

0

主题

72

帖子

554

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

5熟悉之中
509/1000
排名
9612
昨日变化
3

3

主题

101

帖子

509

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1488/1500
排名
1347
昨日变化

1

主题

135

帖子

1488

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

5熟悉之中
754/1000
排名
4529
昨日变化

1

主题

74

帖子

754

积分

Rank: 5Rank: 5

UID
39599
好友
2
蛮牛币
875
威望
0
注册时间
2014-8-13
在线时间
289 小时
最后登录
2018-7-23

蛮牛译员

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

回复

使用道具 举报

7日久生情
2238/5000
排名
19145
昨日变化
1

2

主题

1857

帖子

2238

积分

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

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

回复 支持 反对

使用道具 举报

4四处流浪
371/500
排名
12556
昨日变化
3

3

主题

133

帖子

371

积分

Rank: 4

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

回复

使用道具 举报

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

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熟悉之中
519/1000
排名
7537
昨日变化
1

0

主题

262

帖子

519

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

3偶尔光临
234/300
排名
9612
昨日变化
3

0

主题

53

帖子

234

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

4四处流浪
461/500
排名
4855
昨日变化
1

0

主题

36

帖子

461

积分

Rank: 4

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

回复

使用道具 举报

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

本版积分规则

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