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

扫一扫,访问微社区

蛮牛译馆

关注:531

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 1438|回复: 11

[Unity教程] Unity shader教程—3D打印机shader特效(上)

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

5

主题

24

帖子

183

积分

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

UID
173275
好友
1
蛮牛币
322
威望
0
注册时间
2016-10-2
在线时间
60 小时
最后登录
2017-5-24
QQ
发表于 2016-11-20 04:52:45 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 manew_JR 于 2016-11-21 10:01 编辑

这个教程将会教你重建一个3d打印效果,这个特效在Astroneer(异星探险家)和Planetary Annihilation(行星的毁灭)这两款游戏中使用过。这个有趣的特效会显示一个物体被创建的过程。尽管看上去很简单,但还有很多并不小的挑战。
a1.gif

·介绍:第一个尝试
·第一部分:没有灯光渲染的着色器表面
·第二部分:通过参数的光照功能
这是两部分的教程:
3d打印着色效果——第一部分
3d打印着色效果——第二部分

·介绍:第一个尝试
为了能够重现这个效果,首先我们先做一些简单的事情,一个着色器在给一个物体上色的效果是不同的,这取决于它的位置,为了能知道它的参数,我们需要知道被着色像素的世界坐标,这是可以实现通过添加一个文件命名woldpos在input中,这是一个unity5的表面着色结构
[C#] 纯文本查看 复制代码
struct Input {
        float2 uv_MainTex;
        float3 worldPos;
};


在surface功能中,我们后面可以通过调节y坐标在世界坐标的位置来调节物体的颜色,通过调节SurfaceOutputStandard结构中Albedo的属性来完成它
[C#] 纯文本查看 复制代码
fixed4 _ConstructColor;
 
void surf (Input IN, inout SurfaceOutputStandard o) {
        
        if (IN.worldPos.y < _ConstructY)
        {
                fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                o.Alpha  = c.a;
        }
        else
        {
                o.Albedo = _ConstructColor.rgb;
                o.Alpha  = _ConstructColor.a;
        }
 
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
}



结果得到一个近似astroneer中的效果,主要的问题是应该染色的部分还是阴影状态
01.png


没有灯光渲染的表面着色器
在之前的教程中,PBR和LightingModels,我们探讨过如何用自定义光照模型来做表面着色器。在没有灯光的着色器总是出现同样的颜色,不光是外部光照还是视图方向。我们在下面实现它:
[C#] 纯文本查看 复制代码
#pragma surface surf Unlit fullforwardshadows
inline half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten)
{
        return _ConstructColor;
}



这个唯一的目的就是还原一个单一,稳定的颜色。我们可以看到,这个指的是Unity 4 中用到过的SurfaceOutput。如果我们想创作一个可以和PBR和全球光照系统一起工作的自定义灯光模型的话,我们需要实现一个以SurfaceOutputStandard为输出的功能。在中,如下:
[C#] 纯文本查看 复制代码
inline half4 LightingUnlit (SurfaceOutputStandard s, half3 lightDir, UnityGI gi)
{
        return _ConstructColor;
}



gi这个参数是全球照明系统;但是在我们的无光照的着色器上没有用。尽管有效,这个方法还是有个大的问题。Unity不允许表面着色器选择性的改变光照功能。我们不能用标准的Lambertian光照在物体的底部,让顶部没有光照。我们只能为整个物体制定一个光照功能。我们就可以根据物体的位置老改变物体被渲染的方式。


通过参数的光照功能:
02.png


通过参数的光照功能:

不幸的是,光照功能不能访问对象的位置。最简单的提供信息的方式是运用我们在surface功能中设置的布尔变量(叫做building)。这个变量可以通过我们新的光照功能查询。

[C#] 纯文本查看 复制代码
int building;
void surf (Input IN, inout SurfaceOutputStandard o) {
        
        if (IN.worldPos.y < _ConstructY)
        {
                fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
                o.Albedo = c.rgb;
                o.Alpha  = c.a;

                building = 0;
        }
        else
        {
                o.Albedo = _ConstructColor.rgb;
                o.Alpha  = _ConstructColor.a;

                building = 1;
        }

        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
}


扩展标准灯光功能:
最后一个问题很棘手。之前的内容解释过,我们能用building来改变光照的计算方式。正在被建造的部分是没有光照的。如果我们的材质用的是PBR,我们不可能为了逼真的灯光重写全部的代码。唯一合理的解决方案是调用Unity已经实现了的照明功能。
在传统的标准表面着色,# pragma这个指令指定使用PBR光照功能如下:

[C#] 纯文本查看 复制代码
#pragma surface surf Standard fullforwardshadows



遵循Unity的命名规则,这个效果应该叫做LightStander。是在文件UnityPBSLighting.cginc中找到的,在必要时会被使用。
计划是建一个自定义的光照,叫做 LightingCustom。一般情况下只是调用了Unity标准PBRLightingStandard。然而必要时,就会采用之前定义的LightingUnlit。


[C#] 纯文本查看 复制代码
inline half4 LightingCustom(SurfaceOutputStandard s, half3 lightDir, UnityGI gi)
{
        if (!building)
                return LightingStandard(s, lightDir, gi); // Unity5 PBR
        return _ConstructColor; // Unlit
}



Unity 5 需要一个附加的函数定义,来完成这个代码的编译:


[C#] 纯文本查看 复制代码
inline void LightingCustom_GI(SurfaceOutputStandard s, UnityGIInput data, inout UnityGI gi)
{
        LightingStandard_GI(s, data, gi);                
}



这是运用了全球照明系统来计算光照,不过对于本篇教程的目的并不是必须的。

结果正是我们希望看到的:

03.png

结论:
这片文章主要讲了如何把两种光照模型用在同一种材质上。这让我们用PBR渲染了一半的模型,另一半则是没有光效的。下一篇是这个教程的最后一篇文章,讲了如何加动画和加强这个效果。

08.gif



原文作者:Alan Zucconi
原文链接:http://www.alanzucconi.com/2016/ ... art-1/#introduction

     蛮牛译林军福利多多哦!
155547iluo7umxezrb2ekr.png
本文由蛮牛译员:neosuo独家翻译,如有问题,请及时联系,除合作媒体及合作伙伴外,禁止转载。





回复

使用道具 举报

排名
10809
昨日变化
3

5

主题

24

帖子

183

积分

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

UID
173275
好友
1
蛮牛币
322
威望
0
注册时间
2016-10-2
在线时间
60 小时
最后登录
2017-5-24
QQ
 楼主| 发表于 2016-11-20 05:03:13 | 显示全部楼层
忘加原文作者了
原文作者:Alan Zucconi
原文链接:http://www.alanzucconi.com/2016/10/02/3d-printer-shader-effect-part-1/#introduction

回复 支持 反对

使用道具 举报

4四处流浪
498/500
排名
10983
昨日变化
2

1

主题

78

帖子

498

积分

Rank: 4

UID
1944
好友
1
蛮牛币
936
威望
0
注册时间
2013-8-13
在线时间
366 小时
最后登录
2017-5-27
发表于 2016-11-20 16:47:22 | 显示全部楼层
markmarkmarkmarkmark

回复 支持 反对

使用道具 举报

5熟悉之中
538/1000
排名
5245
昨日变化

1

主题

122

帖子

538

积分

Rank: 5Rank: 5

UID
62741
好友
0
蛮牛币
501
威望
0
注册时间
2014-12-21
在线时间
237 小时
最后登录
2017-5-28
发表于 2016-11-21 13:20:08 | 显示全部楼层
66666,不错学习了

回复 支持 反对

使用道具 举报

4四处流浪
416/500
排名
6417
昨日变化
4

0

主题

73

帖子

416

积分

Rank: 4

UID
115241
好友
2
蛮牛币
124
威望
0
注册时间
2015-7-26
在线时间
205 小时
最后登录
2017-5-20
发表于 2016-11-21 14:28:54 | 显示全部楼层
没有完整的例子么,试着弄了一下没成功,求楼主分享个例子给我,谢谢

回复 支持 反对

使用道具 举报

7日久生情
2348/5000
排名
247
昨日变化
1

7

主题

433

帖子

2348

积分

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

UID
2795
好友
31
蛮牛币
7584
威望
0
注册时间
2013-8-29
在线时间
456 小时
最后登录
2017-4-28

社区QQ达人

发表于 2016-11-21 14:59:18 | 显示全部楼层
大神,麻烦给个完整的着色器代码,感激不尽啊

回复 支持 反对

使用道具 举报

排名
21229
昨日变化
8

0

主题

10

帖子

47

积分

Rank: 1

UID
91934
好友
1
蛮牛币
63
威望
0
注册时间
2015-4-14
在线时间
25 小时
最后登录
2016-12-13
发表于 2016-11-21 20:19:13 | 显示全部楼层
{:91:} unity4.7.0的

3dprinter.zip

1.36 KB, 下载次数: 74

点评

感谢,很有用  发表于 2017-3-11 20:23

回复 支持 1 反对 0

使用道具 举报

4四处流浪
416/500
排名
6417
昨日变化
4

0

主题

73

帖子

416

积分

Rank: 4

UID
115241
好友
2
蛮牛币
124
威望
0
注册时间
2015-7-26
在线时间
205 小时
最后登录
2017-5-20
发表于 2016-11-22 10:13:35 | 显示全部楼层

感激不尽

回复 支持 反对

使用道具 举报

4四处流浪
416/500
排名
6417
昨日变化
4

0

主题

73

帖子

416

积分

Rank: 4

UID
115241
好友
2
蛮牛币
124
威望
0
注册时间
2015-7-26
在线时间
205 小时
最后登录
2017-5-20
发表于 2016-11-22 10:15:05 | 显示全部楼层

感激不尽

回复 支持 反对

使用道具 举报

排名
17818
昨日变化
3

0

主题

31

帖子

75

积分

Rank: 2Rank: 2

UID
5982
好友
0
蛮牛币
79
威望
0
注册时间
2013-10-19
在线时间
26 小时
最后登录
2016-11-24

社区QQ达人

发表于 2016-11-24 12:52:25 | 显示全部楼层
马克一下,马上回来~

回复 支持 反对

使用道具 举报

5熟悉之中
568/1000
排名
4118
昨日变化
2

5

主题

154

帖子

568

积分

Rank: 5Rank: 5

UID
158249
好友
1
蛮牛币
1672
威望
0
注册时间
2016-7-22
在线时间
163 小时
最后登录
2017-5-27
发表于 2016-12-15 16:13:50 | 显示全部楼层
好牛 。。。。。。。。。。。。。。。。。
[发帖际遇]: y876265603 乐于助人,奖励 3 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

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

本版积分规则

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