使用Shader Graph着色器视图制作动画材质

Unity 2018.2中,我们给Shader Graph着色器视图加入了“Vertex Position”输入,允许你调整网格并设置网格动画。

本文将演示如何创建顶点动画着色器,并提供一些常见示例,例如:风和水着色器。如果你对Shader Graph着色器视图还比较陌生,可以阅读下面的文章:

下图是Desert Island Scene项目的场景,没使用任何纹理或动画资源,所有内容都通过使用Shader Graph着色器视图来着色和制作动画。110757k6gl01s0gel706l6

着色器是渲染管线中非常强大的一部分,它可以很好控制场景资源的展示效果。通过使用一系列输入和操作,我们可以创建着色器,修改资源上的各种渲染属性,例如:表面颜色和纹理,甚至是网格的顶点颜色。你还可以将这些内容组合成复杂而丰富的动画。

本文将演示如何制作顶点动画,介绍使用遮罩和属性的概念,最后讲解我们如何为Desert Island Scene项目制作着色器。

下载示例项目
下载Desert Island Scene示例项目:
https://github.com/UnityTechnologies/Test_ShaderGraphBlog

下载完毕后,请使用Unity 2018.2或更高版本启动该项目。你可以尝试使用和修改项目中的着色器。该项目包含学习使用Shader Graph着色器视图所需的所有内容。

110801w7c84eb69to667zc
Desert Island Scene场景中的每个着色器都是自定义构建的,请随意修改检视窗口中的着色器数值。每个对象都有预设文件,可以恢复默认数值。

安装Shader Graph着色器视图
使用Shader Graph着色器视图,你的项目必须满足以下要求:
1、在Unity 2018.2或更高版本上运行。
2、使用轻量级渲染管线或高清晰渲染管线,由于LWRP的编译速度更快,建议使用LWRP来进行尝试。
3、资源包管理器中已安装Shader Graph资源包。

为了安装Shader Graph着色器视图,需要创建Unity 2018.2或更高版本的项目,或是将项目更新至该版本,然后打开Window > Package Manager > All,在列表中找到Shader Graph,点击install。

如果材质没有在场景视图中播放动画,请勾选Animated Materials。

顶点位置(Vertex Position)的基础功能
在通过数学运算移动内容之前,我们需要理解要移动的内容是什么。

如下图所示,场景中的网格拥有四类空间(Space):
1、对象(Object):相对于网格轴心的顶点位置。
2、视图(View):相对于摄像机的顶点位置。
3、世界(World):相对于世界原点的顶点位置。
4、切线(Tangent):用于解决一些特殊用例,例如:根据像素形成的光照。

110801v0b4026kkg46bzko.png.thumb
你可以在Position节点的下拉列表中选择要修改的Space类型。

通过使用Split节点,我们可以选择要处理的通道。

image13Split节点输出四个通道,前三个通道对应Transform轴(R=X, G=Y, B=Z)。上面的示例中,我们分离对象的Y轴并加了1,使对象在该轴向上移动1个单位。

有时你可能希望在世界空间移动对象。请先在Position节点中选择World,然后使用Transform节点将输出结果转换回对象空间。

使用遮罩
现在我们已经确定了移动网格的方法,接下来了解如何限制效果。

通过使用Lerp这样的节点,我们可以混合二个数值。T输入是Lerp节点的控制值,当T输入为0时(显示为黑色),使用A通道。当T输入为1时(显示为白色),使用B通道。

下面的示例中,滑块用于在二个输入之间进行混合,以下示例可以用来代替滑块。

110802snnwqlnu11l0jf23
纹理遮罩
通过黑色和白色纹理,我们可以使用细节形状来推动网格。

下图示例中,白色表示范围的最大高度,黑色表示不对网格位置产生任何影响。这是因为黑色的数值为0,所以给网格位置加0不会使它移动。

110808kmiwlilsabnibunh
如果需要带有独特形状或具有特定衰减程度的遮罩,纹理会特别有用。

UV遮罩
和纹理遮罩类似,你可以通过UV遮罩选择要处理网格的哪个部分,具体根据UV展开而定。

下图中,我们使用UV的U轴创建从左到右的渐变效果。如果要偏移渐变,使用Add节点;如果要提高强度,使用Multiply节点;如果要提高衰减程度,使用Power节点。image8顶点颜色遮罩
每个顶点存储一个Vector3信息单元,我们称它为顶点颜色(Vertex Colour)。通过使用Poly Brush插件,我们可以直接在编辑器中绘制顶点颜色。或者,我们也可以使用3D建模软件,例如:3ds Max、Maya、Blender、3D Coat或Modo等来指定顶点颜色。

请注意:默认情况下,多数3D建模软件会导出带有RGB最大值的模型,这些RGB最大值会指定到各个顶点上。

下图中,Vertex Colour节点被分离为红色(R)通道,然后连接Lerp节点的T通道,用作遮罩。当输入为0时,使用Lerp节点的A通道,当输入为1时,使用B通道。实际使用中,如果顶点已指定了红色顶点颜色的话,上述设置只会给Y轴加1。

image2世界方向遮罩
通过使用Normal Vector节点,我们可以通过网格表面方向来遮蔽输入。Split节点允许我们选择需要作用的通道(R=X, G=Y, B=Z)。

下图中,我们使用Y轴来遮罩,所以只有方向朝上的表面为正值。重要的是,使用Clamp节点来去掉不在0~1范围的内的数值。

image20世界位置遮罩
如果对象的位置处于世界空间Y轴为0的位置之上,这一系列节点会遮蔽输入。
image9属性
在制作着色器时,可能很难为理想效果获取正确输入值。出于这个原因,同时也为了之后使用预制件和预设置进行自定义,我们需要使用属性。

属性允许我们编译着色器后修改着色器的数值。创建属性,请点击图中的 + 图标。属性共有六种类型:
1、Vectors (1-4):数值的字符串,带有Vector1的滑块选项。
2、Color:带有颜色选择器的RGB值和可选的HDR版本。
3、Texture2D(和Texture2D Array):2D纹理示例
4、Texture 3D:3D纹理示例
5、Cubemap:生成的Cubemap示例
6、Boolean:控制关或开的选项。等同于0或1。

111512hknn4upk9cjvj5jg.png.thumb

Desert Island Scene示例
下面讲解为Desert Island Scene项目制作着色器的示例。

1、飘舞的旗帜
旗帜的着色器会在旗帜上使用正弦波平移对象空间,并使用UV遮罩来保持左侧的静止状态。

111613zz2c65bpci6jp6zv
首先反转UV遮罩,将其与自身相乘,实现Y轴上平滑的渐变效果。这一步用于将旗帜的中心向远离船桨的方向弯曲。

然后生成对象空间的正弦波,它带有属性用于控制正弦波的振幅、频率和波速。正弦波被X轴上的UV遮罩遮蔽,以保持旗帜左侧的静止状态。

通过将Gradient Noise输出至Step函数,然后传入Alpha Clip Threshold,我们可以去掉一些像素来实现旗帜的残破效果。

Graph_Flag-12、风中的草和棕榈树叶
风着色器使用世界空间位置的Gradient Noise,沿着单个轴平移,实现轻轻吹动树叶和草丛的效果。
111620qqqqmlk2bsff23yb
我们将Gradient Noise放在基于世界坐标的Y轴和X轴上。通过使用Vector2,我们可以控制偏移的速度和方向。

属性用于控制偏移的密度和强度。从Gradient Noise减去0.5可以确保网格被均等地推拉。

UV遮罩用于保持树叶和草丛根部的静止状态。最后,使用Transform节点来将世界位置转换为对象位置。

Graph_PalmLeaves3、腼腆的蚌
通过使用该着色器,我们可以计算摄像机和蚌之间的距离,然后将距离作为遮罩,用来旋转蚌的上半部分。
111626rzsfees6zsn6gzfn
通过将游戏对象的位置和摄像机位置输入到Distance节点,我们可以创建遮罩。One Minus节点会反转距离,使我们在接近蚌的时候得到正值。Clamp节点会去掉大于1或小于0的值。

该UV遮罩只会选择蚌的上半部分,但多数情况下,使用顶点颜色遮罩更简单也更灵活。

Lerp节点用于混合蚌的关闭和打开状态。Rotation会应用于游戏对象的Y轴和Z轴。使其绕着X轴旋转。

Graph_Clam4、游动的鱼
此着色器中,我们使用了正弦波,它沿着对象的轴生成,实现鱼的摆动效果。我们会遮蔽了鱼的头部,使鱼头保持静止。
111632zr6rp36d3hqtyr7l
首先,该着色器会沿着对象空间的Y轴和Z轴生成正弦波,通过属性控制频率和波速。因为我们使用X轴和Y轴,鱼会沿着它的宽度和高度摆动。

然后乘以正弦波的输出结果,控制摆动的振幅、距离和强度,并将其添加到对象的X轴。

使用Lerp节点来遮蔽鱼的前面部分,同时还要使用X轴和UV通道。通过使用带有属性的Power节点,我们可以将摆动效果移动到鱼的后面部分。

Graph_FishWobble5、海浪
最后是海浪着色器。该着色器会偏移网格顶部,使用三个不同大小和角度的正弦波,这三个正弦波也用于生成波谷和波峰。
111637um65osn42a94ddbi
首先在世界空间生成三个独立的正弦波,每个正弦波使用属性来控制波的振幅、频率、速度、收敛和旋转。

将三个正弦波和二个Add节点结合,然后乘以世界比例渐变,从而分解波峰的高度。结合后,正弦波会被添加到对象位置。

使用二个顶点遮罩来将正弦波限制在圆顶的顶部,然后在绘制泡沫时,将正弦波向下推回。

 

sine-wave6生成正弦波
通过分离X轴和Z轴,我们在二个方向生成了正弦波。然后使用二个倍数来设置每个正弦波的效果。例如:将Z通道乘以0,只会在X轴输出一个正弦波。

分离World Position节点到X轴和Z轴,然后将它们结合到Vector2,会得到世界空间中的UV空间。这会确定Gradient Noise在世界空间中的方向。通过将该输出添加到时间,我们偏移了正弦波,分解了原本的直线。

Sine节点使用世界空间和时间来生成简单的正弦波,从而使波峰成为绝对节点,用于翻转负值。One Minus节点会反转这些数值,使波峰处于顶部。

特殊说明
本文所有着色器视图均提供高清版图片,如果无法清晰阅读,请访问下面地址获取:
https://blogs.unity3d.com/cn/201 … -with-shader-graph/

如果需要关于Shader Graph着色器视图的详细文档,包括每个节点的说明,请查看GitHub上Shader Graph开发者Wiki。
https://github.com/Unity-Technologies/ShaderGraph/wiki

Unity 2018.3 Beta版发布

今年7月,我们发布了Unity 2018.2,它大幅提升了轻量级渲染管线LWRP和高清晰渲染管线HDRP的性能,帮助开发者轻松获得高端视效质量。该版本还包含对Shader Graph着色器视图的多项改进,目前Shader Graph着色器视图已支持LWRP和HDRP,而且还为移动端、2D和脚本编写添加了多项新功能。

112900epp2p9pzpj2j2jk9.jpg.thumb
现在Unity 2018.3 Beta版发布,我们邀请开发者参与早期测试,体验Unity 2018.3中全新以及改进功能,包括:嵌套预制件、2D等距Tilemap等功能。本文将介绍Unity 2018.3 Beta版中关键的改进功能,并帮助开发者了解如何获取早期测试版本。

嵌套预制件和改进的预制件工作流程
Unity 2018.3 Beta版将为开发者带来改进预制件工作流程,包括:嵌套预制件(Nested Prefab)、预制件变体(Prefab Variant)和预制件模式(Prefab Mode)。

全新预制件工作流程允许开发者以粒度等级(Granular Level)拆分场景和预制件。该工作流程将带来更高的灵活性,提升工作效率并让开发更为得心应手,从而不必担心发生耗费时间的错误。

这些改进内容是基于150多家企业用户的调查、大量访谈、数次可用性测试以及二次Game Jam活动获得的信息而开发的。该版本的长期计划是不仅是实现嵌套支持,还要重新构思核心预制件工作流程,从而使不同团队成员可以同时高效地编辑预制件。

点击访问下面的视频了解新预制件工作流程:

[anyplayer:url=http://super007fbi.kmdns.net:444/wp-content/uploads/video/007.flv width=640 height=360 title=新预制件工作流程 open=no]

1、嵌套预制件 
嵌套预制件将具有更高的灵活性和生产效率。此前我们必须在创建例如建筑这样的大型单块的预制件,或例如家具更细粒度的预制件之间作出选择,无法拥有同时具备二种类型的预制件。

现在有了嵌套预制件的支持后,大型建筑预制件可以由多个较小房间预制件组成,进而能够由多个家具预制件组成,以此类推。

它将为任何规模的团队带来便利:

  • 将预制件分为多个条目,实现更高的效率
  • 重用任何内容,包括从小到大的各类内容
  • 同时处理内容的不同部分

2、预制件变体 
默认情况下,预制件变体会继承对象和原预制件的属性,与此同时开发者还可以重写这些属性,为变体添加组件和游戏对象。该功能类似面向对象编程的继承概念。

例如:如果你有一个门的预制件,你可以为其创建变体,给它指定不同的网格和材质,使它看起来有破旧的感觉。

对基础预制件做出的任何修改都会影响变体,例如:你可以通过修改门的基础预制件中碰撞体的大小,轻松调整二个门的碰撞体大小。

3、预制件模式 
预制件模式是全新工作流程的基础,它能让开发者单独编辑预制件。你将能够编辑整个预制件资源,不必将其实例化到场景后再编辑或编辑已有的实例,这意味着开发者可以避免由于在场景意外应用重写而产生的错误。独立编辑功能让你能够放心做出修改。

2D Tilemap等距功能
2D Tilemap世界构建工具现在允许开发者构建等距瓦片地图,从而轻易创建特定类型的游戏并隐藏对象。它能让你轻松创建多种游戏,例如:2D模拟经营游戏。

Tilemap渲染器还能对每个瓦片分类,优化动态批处理渲染。你可以使用它来创建等距世界,其中瓦片能够隐藏对象,游戏中的角色可以走到建筑、树木和其它对象背后。

该功能的另一个优点是开发者可以以特定垂直偏移绘制瓦片。这将允许开发者在等距世界中创建高层结构,该结构能够隐藏背后的其它对象。此功能适合与 “自定义轴排序”(Custom Axis Sort)功能一同使用。

112859fpian8vw5lohv8g3
粒子系统
新版本将移除旧粒子系统。我们提供了一个更新工具,它将旧组件,例如:ParticleEmitter,转换为新组件,例如:ParticleSystem。该升级功能请在Unity 2018.2及更早版本中使用。

获取更新工具:
https://forum.unity.com/threads/ … tem-updater.510879/

从Unity 2018.3开始,开发者将无法使用旧粒子组件。

Unity 2018.3为粒子系统带来了大量改进内容和新功能。值得一提的是,我们对External Forces模块的改造已经完成。它将引入全新粒子系统的Force Field组件,该组件能够给粒子施加各类作用力。

我们还添加了Ringbuffer模式,它能用于实现持续效果,例如:脚印和弹孔。Texture Sheet Animation模块将添加二个新模式,从而以固定每秒帧数或基于粒子速度来为粒子纹理设置动画。Shape模块加入了新选项,它允许你从网格顶点连续发射粒子,就像旧粒子系统中的Systematic选项一样。

Unity 2018.3 Beta版本还有很多较小的改动,包括:Burst Probability选项、网格粒子的各个粒子翻转功能、Shape模块在场景视图中的辅助图示得到改进,以及禁用公告牌滚动的功能,该功能对VR应用非常有用,适用于处理用户倾斜头部时产生的变化。

导航系统
在导航系统中,我们使预制件中的NavMesh能够直接在预制件模式中独立烘焙。而且,我们添加了NavMeshQuery.Raycast()方法,它能在作业中调用,用于跟踪NavMesh上二个位置间的直线路径。

后续我们还会不断添加更多改进内容,也期待开发者能够提供给我们对于导航系统的反馈。

其它功能和改进
其它功能和改进包括将NVIDIA PhysX的版本从3.3升级到3.4。还支持了Roslyn编译器,允许你使用最新的C# 7功能。此外,Android App Bundles的支持将根据设备配置为用户提供优化后的APK文件。

获取新版本
你可以通过下载Unity Beta版来访问到上述所有内容,在使用新功能同时,还可以帮助我们寻找Bug以保证Unity发布最高质量的软件。

成为Unity Beta版的测试者,你将获得最新的新特性,并且可以测试项目是否与新Unity Beta测试版本兼容。

你也可以成为Unity的一名专家,与Unity社区分享你的见解,赢取我们的礼品。我们会收集来自你的调查结果,反馈意见,你的意见可能会影响Unity的未来。你也将有机会成为获得特殊福利的精英团体的一员,获得Unity商品的折扣和特殊活动邀请。

下载Unity Beta版本:
https://unity3d.com/cn/unity/beta

了解如何成为一名合格的Unity Beta版测试人员,请参考《Unity测试人员指南》:
https://forum.unity.com/threads/ … beta-tester.402777/

小结
了解更多新功能、改进和修复的完整列表,请参考Unity 2018.3 Beta版发行说明:
https://unity3d.com/cn/unity/beta-download#release-notes

我们也期待来自你对Unity 2018.3 Beta版本功能的反馈,我们将持续在Unity官方微信以及Unity官方论坛上发布详细的功能预览,敬请关注!更多技术文章请访问Unity官方社区(UnityChina.cn) !

Unity与DeepMind合作推动人工智能研究

今天,我们正式宣布Unity与人工智能研究领域的全球领导者DeepMind进行合作,此次合作将帮助DeepMind的研究人员使用Unity开发虚拟环境和任务,支持DeepMind的基础人工智能研究项目

110802duyru8ecysy7yoou.jpg.thumbDeepMind的联合创始人兼首席执行官Demis Hassabis表示:“游戏和模拟是DeepMind研究计划最核心的部分,这种方法已经在人工智能研究方面取得了重大突破。我曾经是一名游戏设计师,所以对使用Unity创建虚拟环境,进行开发和测试我们解决实际问题所需的智能,灵活算法感到非常兴奋。”

Unity AI与机器学习副总裁Danny Lange表示:“DeepMind的研究人员正在试图解决大量人工智能的问题,他们选择了Unity作为主要研究平台,用于创建复杂的虚拟环境并开发能学会解决复杂任务的算法。我们相信人工智能的未来将由日益复杂的人机交互塑造,Unity非常自豪能够成为实现这些交互的引擎。”

110802zr26eg0z4g64n6nn.jpg.thumb
Unity对于人工智智能领域的研究并不陌生。一年前,Unity发布并开源了机器学习代理ML-Agents Toolkit,使机器学习研究人员能够使用Unity研究复杂行为,并为游戏开发人员提供最前沿的机器学习技术。加入机器学习代理ML-Agents Toolkit后,Unity正快速成为智能代理开发的首选平台。

在Arxiv发表的参考论文中,我们详细介绍了如何使用Unity来创建并利用模拟环境,这些环境拥有丰富的感知和物理复杂性,能够带来有趣的识别挑战,以及支持动态多代理交互功能。这些模拟环境将为加速计算机视觉、机器人、自然语言命令、自动驾驶汽车开发以及众多科学技术领域人工智能研究奠定基础。这是一个未来崭新的开始。

资源信息
了解更多关于Unity机器学习信息:https://unity3d.com/cn/machine-learning
下载Unity机器学习代理:https://github.com/Unity-Technologies/ml-agents
Arxiv论文《Unity: A General Platform for Intelligent Agents》:https://arxiv.org/abs/1809.02627

关于DeepMind
DeepMind是一家受神经科学启发所创建的人工智能公司。它开发通用学习算法,并利用其来帮助解决世界上一些最紧迫的挑战。自2010年在伦敦成立以来,DeepMind已发表了200多篇同行评审论文,其中6篇发表在最顶尖的科学杂志《自然与科学》上,这是计算机科学实验室史无前例的记录。2014年Google收购了DeepMind,这是欧洲有史以来规模最大的一次收购。DeteMind的开创性工作包括发展深度强化学习,结合深度学习和强化学习的领域。2016年,这项技术支撑着AlphaGo在世界围棋人机大战中击败了世界冠军李世石。DeepMind现在正将其技术专长应用于复杂的现实世界领域,例如:健康,包括与若干医院展开合作,提供先进的技术为患者和医生进行服务。

关于Unity Technologies
Unity是世界上使用最广泛的实时3D开发平台的创建者,为世界各地的开发人员提供了创建丰富,交互式2D,3D,VR和AR体验的工具。公司拥有超过800人技术工程师团队通过与Google,Facebook,Oculus和Microsoft等合作伙伴进行紧密合作,以确保为最新版本和平台提供优化支持,使Unity始终保持处于技术前沿。目前全球超过30亿台设备上都拥有使用Unity创作的游戏与体验,过去12个月内安装次数超过了240亿次。Unity众所周知的灵活性使开发人员能够针对包括Xbox One、PlayStation 4、Gameroom、SteamVR、Oculus、PSVR、Gear VR、HoloLens、ARKit、ARCore等25多个平台优化他们的创作。同时Unity还提供解决方案与服务,包括:Unity Ads广告,Unity Analytics分析,Unity Asset Store资源商店,Unity Cloud Build云构建,Unity Collaborate协作,Unity Connect和Unity Certification认证。