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

扫一扫,访问微社区

开发者专栏

关注:2061

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

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

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

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

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

45

主题

288

帖子

2959

积分

Rank: 9Rank: 9Rank: 9

UID
44527
好友
55
蛮牛币
2469
威望
0
注册时间
2014-9-12
在线时间
553 小时
最后登录
2017-12-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日久生情
2087/5000
排名
4416
昨日变化
36

2

主题

1531

帖子

2087

积分

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

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

回复

使用道具 举报

3偶尔光临
220/300
排名
10610
昨日变化
139

0

主题

98

帖子

220

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

5熟悉之中
667/1000
排名
6131
昨日变化
42

0

主题

329

帖子

667

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

4四处流浪
421/500
排名
6671
昨日变化
53

0

主题

149

帖子

421

积分

Rank: 4

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

回复

使用道具 举报

4四处流浪
451/500
排名
4376
昨日变化
32

0

主题

61

帖子

451

积分

Rank: 4

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

回复

使用道具 举报

4四处流浪
378/500
排名
10474
昨日变化
4

3

主题

75

帖子

378

积分

Rank: 4

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

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1133/1500
排名
1881
昨日变化
3

1

主题

126

帖子

1133

积分

Rank: 6Rank: 6Rank: 6

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

回复

使用道具 举报

5熟悉之中
675/1000
排名
4513
昨日变化
2

1

主题

61

帖子

675

积分

Rank: 5Rank: 5

UID
39599
好友
1
蛮牛币
879
威望
0
注册时间
2014-8-13
在线时间
253 小时
最后登录
2018-1-14

蛮牛译员

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

回复

使用道具 举报

7日久生情
2177/5000
排名
17749
昨日变化
10

2

主题

1818

帖子

2177

积分

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

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

回复 支持 反对

使用道具 举报

3偶尔光临
250/300
排名
13667
昨日变化
273

1

主题

95

帖子

250

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

6蛮牛粉丝
1303/1500
排名
970
昨日变化
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运算开销很大,不知道是不是真的。用细分着色器可以吗

回复 支持 反对

使用道具 举报

3偶尔光临
229/300
排名
12916
昨日变化
230

0

主题

139

帖子

229

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

2初来乍到
102/150
排名
17173
昨日变化
566

0

主题

45

帖子

102

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

3偶尔光临
202/300
排名
8469
昨日变化
104

0

主题

24

帖子

202

积分

Rank: 3Rank: 3Rank: 3

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

回复

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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