查看原文
其他

Unity 5着色器编程经验分享

2017-07-11 Unity官方 Unity官方平台

今天为大家分享一位来自荷兰的大三学生Emiel Boven,在成立游戏工作室并开发一款黑魂类动作冒险游戏的过程中,对Unity中的着色器编程所进行的探索与研究,本文不会涉及具体的代码,主要为大家分享在Unity中实现冰雪与天空着色器的一些经验。


Unity着色器基本概念


着色器的本质其实非常简单:就是用来传递并处理3D坐标及属性的小程序,最后写入屏幕以2D图像呈现。Unity自带的标准着色器都拥有特定功能,也可以利用自定义着色器来替换标准着色器来改变最终输出的图像效果,如自定义顶点及片段(或像素)着色器。例如,顶点着色器可以利用位移贴图对模型的顶点坐标进行位移,而无需改变所导入的模型文件。



想要编写光照交互效果正常的着色器比较复杂,所以大多数情况下通常会使用表面着色器来实现这类效果。Unity的表面着色器可以生成大部分的光照计算,所以开发者不用自己手动编写这些计算公式,从而专注于最终想要实现的效果。而对于不需要进行光照计算的特效,例如延迟贴花与后处理特效等,仍旧会使用顶点及片段着色器。

 

使用Unity进行着色器编程,也可以借助像Amplify Shader Editor或Shader Forge这样的可视化节点编辑器,无需编写代码即可实现非常酷炫的着色器特效。当然,了解更多的底层原理也更有助于理解渲染管线工作流,并利用这些节点编辑器来实现更加复杂的着色器。

 

冰雪着色器


本例在创建冰雪着色器时,用到了两种不同的材质,一种是普通的雪材质,另一种材质上方是雪连带着下方的冰锥。第二种材质会从世界坐标Y轴创建遮罩来显示雪,而冰只会朝着物体表面的正上方或正下方。这样就可以确保旋转网格后冰锥依然朝着游戏世界下方。雪与冰锥都使用位移贴图对上方或下方的顶点进行位移,来实现雪堆积在物体上方的效果。冰锥与雪的处理方式稍有不同,冰锥使用噪声贴图对底部一些部分进行遮罩,例如墙壁上的冰锥会与上方的雪交融,有些则不会与雪交融而是直接悬挂为锯齿状的冰锥效果。

 

然后将顶点颜色应用到模型,这一操作可以在3D建模软件种完成,也可以利用顶点绘制工具直接在引擎中进行,就像遮罩一样混合两种材质覆盖到网格上。



天空盒着色器


本例的天空盒着色器使用节点编辑器制作,它能够将创建的云纹理映射到天空盒。包含云纹理的文件共有3张存储在单独RGB通道中的黑白贴图。这三张贴图将被加载到着色器中,分别用于实现云的形状、边缘光以及内侧阴影。在着色器中为这些贴图分别设置颜色以便在需要时单独调整其中某一部分的效果。边缘光效果比其它两张贴图更特殊,它与太阳周围的距离渐变相乘,也就是说,只有在太阳接近云层时才会出现边缘光效果。



云层是动态的,所以这里使用噪声纹理来操作静态图片的UV,让云层可以缓慢飘过天空并变换形状。



着色器实现

在Unity中实现着色器是比较简单的,无论是手动编写还是利用节点编辑器插件。如果没有任何着色器相关经验,建议大家从Amplify Shader Editor或Shader Forge这样的可视化编辑工具开始入手,来实现一些简单的着色器特效并尝试理解材质、纹理及底层渲染原理,以便于后期可以制作出更加复杂更加酷炫的着色器。借助这些工具可以有效提高开发效率,避免手动编写带来的语法错误,也不必再去记住各种方法的具体名称。


结语

着色器的应用十分广泛,可以实现多种基于网格的奇妙效果,也能用于粒子系统与后处理特效。它除了可以为游戏效果增色添彩之外,还可以带来全新的游戏玩法设计。后面我们还会为大家分享更多着色器编程相关的实例教程在Unity官方中文社区(unitychina.cn),请大家保持关注!


推荐阅读

教程 | 自制简易的游戏存档系统

案例 | 巧用Shader,游戏玩法新思路

案例 |《影子战术》:层级优化经验分享

Unity如何利用Mapbox在游戏中实现真实地图

Unity Analytics分析服务新功能Remote Settings


官方活动


活动一:7月Unity技术路演,Unity技术路演将从沿海深入腹地,即将来到武汉和西安,为当地开发者带来引擎新功能介绍演示和2个不同主题的Workshop内容。报名仅剩最后4天!


活动二:首次Unity 2017.1新功能Timeline & Cinemachine相关的技术直播课即将于7月19日晚开始,现在就来预约席位


活动三:由Unity Ads, AppsFlyer, App Annie和StartApp携手带来的“Midnight Carnival”(午夜嘉年华)派对现已开放报名


点击“阅读原文”进入Unity官方中文社区

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存