Skip to main content
 首页 » 资源教程 » Unity3D教程

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

2016年11月21日 20:57:361780蛮牛网

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

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第1张

·介绍:第一个尝试

·第一部分:没有灯光渲染的着色器表面

·第二部分:通过参数的光照功能

这是两部分的教程:

3d打印着色效果——第一部分

3d打印着色效果——第二部分

·介绍:第一个尝试

为了能够重现这个效果,首先我们先做一些简单的事情,一个着色器在给一个物体上色的效果是不同的,这取决于它的位置,为了能知道它的参数,我们需要知道被着色像素的世界坐标,这是可以实现通过添加一个文件命名woldpos在input中,这是一个unity5的表面着色结构

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第2张

在surface功能中,我们后面可以通过调节y坐标在世界坐标的位置来调节物体的颜色,通过调节SurfaceOutputStandard结构中Albedo的属性来完成它

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第3张

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

没有灯光渲染的表面着色器

在之前的教程中,PBR和LightingModels,我们探讨过如何用自定义光照模型来做表面着色器。在没有灯光的着色器总是出现同样的颜色,不光是外部光照还是视图方向。我们在下面实现它:

这个唯一的目的就是还原一个单一,稳定的颜色。我们可以看到,这个指的是 4 中用到过的SurfaceOutput。如果我们想创作一个可以和PBR和全球光照系统一起工作的自定义灯光模型的话,我们需要实现一个以SurfaceOutputStandard为输出的功能。在中,如下:

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

通过参数的光照功能:

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第4张

通过参数的光照功能: 

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

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第5张

扩展标准灯光功能:

最后一个问题很棘手。之前的内容解释过,我们能用building来改变光照的计算方式。正在被建造的部分是没有光照的。如果我们的材质用的是PBR,我们不可能为了逼真的灯光重写全部的代码。唯一合理的解决方案是调用Unity已经实现了的照明功能。

在传统的标准表面着色,# pragma这个指令指定使用PBR光照功能如下:

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第6张

遵循Unity的命名规则,这个效果应该叫做LightStander。是在文件UnityPBSLighting.cginc中找到的,在必要时会被使用。

计划是建一个自定义的光照,叫做 LightingCustom。一般情况下只是调用了Unity标准PBRLightingStandard。然而必要时,就会采用之前定义的LightingUnlit。

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第7张

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

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

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

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第8张

结论:

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

Unity shader教程—3D打印机shader特效(上) Unity3D教程 第9张

评论列表暂无评论
发表评论