在Unity HDRP中创建可配置的汽车

位于法国巴黎的Light & Shadows公司创立于2009年,旨在满足大型工业公司对优质视觉内容不断增长的需求。自成立以来,Light & Shadows就通过不断调整和创新给客户提供的新功能而蓬勃发展,提供高质量渲染画质的同时,提高生产效率和有效降低成本。

Unity和Light & Shadows通过紧密的合作,共同实现了实时逼真的高质量视觉效果。本文将由Light & Shadows分享使用Unity高清渲染管线HDRP实时渲染令人惊艳的雷克萨斯LC500演示视频。

014410m6cg9a2woci9va11.png.thumb.jpg

实时渲染:汽车行业的革新技术
新技术正在转变我们体验,销售和购买汽车的方式。Light & Shadows在汽车可视化和离线渲染有着丰富的经验,这可以从标致雪铁龙汽车配置工具和达索航空公司项目得到证明。

我们与Unity达成合作,使用HDRP制作实时渲染效果,并实现全新水准的视觉质量和性能。为了证明这些新功能的强大,我们制作了一个演示视频来展示雷克萨斯LC500的实时渲染效果。

观看雷克萨斯LC500演示视频

项目创作流程

CAD数据准备工具和流程
对于雷克萨斯LC500项目,雷克萨斯给我们提供了所有可见表面和部分内部几何体的边界表示(B-rep)CAD数据,有了这些数据我们就不必对硬表面进行建模。

由于汽车的模型非常复杂,组织和准备数据成为一项挑战。为了解决这项挑战,我们使用了PiXYZ软件的高级曲面细分和可编程数据准备功能。

作为大多数复杂产品的典型代表,雷克萨斯汽车模型由大量对象的层次结构组成,在这种情况下代表汽车的数千个组件。我们决定分离汽车的外部和内部,这将提供更大的灵活性,允许我们并行处理模型的二个部分。我们能够分离设计内容,包括:动力系统,底盘和汽车结构组件。

源数据不是按文件来组织每辆汽车,而是作为涵盖同一车型的所有几何选项的部件集合。这使我们以合理的方式组织数据,从而将汽车部件的变体作为可选项展示给雷克萨斯的客户。

我们使用一个XML文件,通过相关选项逻辑来连接源数据的每个部分。通过使用XML文件和自定义脚本,我们可以分离汽车的不同变体为一种特别形式,可视化展示每个选项的组合效果。

分离不同部分后,下一步是曲面细分过程。此过程会将CAD数据(B-rep)转换为曲面细分形式(三角面),转换后的数据可以在3ds Max或Unity等工具中使用。通过使用PiXYZ的工具,我们获得了轻量级的曲面细分模型,并同时保持出色的视觉质量。

实现优化光照和烘焙
为了达到设定的高标准视觉质量,我们使用了光照贴图来增强光照效果。作为工作流程的一部分,我们需要展开汽车的每个部分,而且没有任何重叠。我们使用了自动展开工具,并在需要优化接缝位置的地方通过交互式手动展开功能进行处理。

014410gkihkala1l61yfrr.jpg.thumb

可见表面的UV展开

我们评估了二种计算光照贴图的方法:1、直接在Unity中使用内置光照贴图工具。2、在3ds Max使用Octane或V-Ray等第三方渲染工具。

评估二种方法的目的是为了对比不同方法得到的质量级别,并测试使用Unity内置光照贴图工具集成外部光照贴图的工作流程。汽车的内部光照贴图会直接在Unity中计算,通过正确的设置,我们获得了非常不错的结果。

直接光照由实时光线提供,间接光照则由烘焙光线提供。通过使用Unity的这些功能,即使在调整场景的可交互部分,例如转动方向盘和打开车门时,我们也能够提供逼真的视觉效果。在Unity中使用内置的光照贴图非常简单,并且产生了出色的效果。

014433b6v7t888a3hwqwm7

有无光照贴图内部效果变化

我们选择使用Octane光照贴图进行实验,通过交互方式为模型的每个外部对象调整镜面遮蔽。我们在HDRP中编辑了标准着色器,以正确合并分离的UV通道。结果令人满意并生成非常逼真的视觉效果,特别是对车身板件的间隙部分的处理。

使用这二种方法,允许我们对外部光照贴图工具的灵活性和集成光照贴图工具的易用性之间进行权衡。最后结论是二种方法都能够帮助我们达到预期效果。

014433gwsa0wqfnuj4fxaz

有无光照贴图外部效果变化

定制材质,实现逼真效果
凭借我们在汽车离线渲染领域多年的经验,我们以漫反射贴图、高度图、高光贴图、法线贴图等形式积累了大量高分辨率贴图。

在雷克萨斯项目中,我们打算使用常用贴图来实现最佳效果,但是优化性能时,Unity需要将金属度,光滑度和AO图结合到单个贴图的RGB通道中。这种方法对于性能而言是最佳的,但是却给精确调整地图和着色器带来了挑战。

在我们开发此项目时,Shader Graph着色器视图还无法在HDRP中使用,所以我们让开发团队制作了自定义纹理编辑工具,以便让我们直接在标准HDRP着色器中独立加载并调整纹理的每个贴图。

该编辑工具可以直接在Unity中调整材质,极大的提高了工作效率。现在Shader Graph着色器视图已经支持HDRP,所有Unity客户都可以使用相同的功能。

014433mg109cod84482skz.jpg.thumb

自定义纹理编辑

后期处理
后期处理对于给3D场景赋予类似电影和逼真的感觉至关重要。HDRP提供了许多功能来调整场景的最终效果,包括:颜色分级、泛光、晕影和景深等。

014433z8avg3zurq1qh785

有无后期处理的车门内部效果变化

景深是实现真实可视化的重要视觉效果,它有助于观众专注于特定区域并感受沉浸在场景中。在实时应用程序中使用固定的景深焦点值可能会产生不自然的结果。

因此我们编写了一个小型摄像机脚本,它可以自动将焦点设置在相机前面的最近对象上。在Unity中,我们很容易就能通过在场景中投射光线来确定距离最近的对象。

014433pqgd4dvlgojpqpg3

有无景深效果的内部效果变化

重要细节
我们在Unity中使用了Cinemachine来制作“Demo”模式,这是一种使用预设摄像机路径的演示模式,即使没有人和汽车进行交互,也能展示出产品的主要特性。

为了准确地展示汽车,我们提供了一种方法来管理多个不同配置。我们不仅需要在运行时应用中切换变体,还需要在Unity编辑器中进行修改,以确保正确设定了所有变体。为了实现这种效果,我们创建了配置管理脚本,它会记录“场景状态”并提供自动指定汽车材质的功能。

014433zihhh8z4ir8c8qra.jpg.thumb

变体配置逻辑

 

014433lgfpixisvrvr6913

四种不同的内部变体效果

未来展望
开发该项目的经历给予我们使用HDRP的信心,从而能够追求需要更高级别视觉质量的客户项目。

通过使用PiXYZ进行数据准备和Unity最新的渲染,影视和后期处理工具,以及内部的自定义工具和脚本,我们可以高效的制作和部署新项目。

小结
Light & Shadows在雷克萨斯LC500演示视频制作过程中使用HDRP的经验就分享到这里,更多关于Unity在汽车和运输行业的应用信息,请访问:
https://unity.com/solutions/automotive-transportation

更多Unity项目创作经验分享,尽在Unity官方中文论坛(UnityChina.cn)。

[技术] 教程 | 使用Unity全新的预制件工作流程

在Unity 2018.3中,预制件嵌套功能正式发布。我们可以访问全新的预制件模式编辑器,从而独立编辑预制件。新预制件工作流程的速度会更快,我们可以在开发过程中节省不少的时间。

本文中,我们将学习如何使用预制件和新的预制件编辑流程,具体分为三个部分:预制件模式、预制件嵌套、预制件变体。

学习准备
学习本教程,我们需要使用Unity 2018.3或更高版本,请下载本文提供的项目,并使用Unity打开StarterProject文件夹。

下图是项目窗口的文件夹结构:

020639atu36kklalzhh8h3.png.thumb.jpg

每个文件夹的内容如下:
1、Materials:包含项目中使用的材质
2、Models:包含项目中使用的模型
3、Prefabs:包含项目中所有预制件
4、Presets:包含设置家具模型导入设置的预设文件
5、Scenes:包含项目的场景
6、Scripts:包含项目的脚本
7、Sprites:包含UI按钮使用的精灵图片
8、Textures:包含项目的主要纹理

了解场景
首先,我们打开Assets \ RW \ Scenes \ Factory文件夹中的Factory场景,场景中是工厂的一部分区域,随机生成的家具会在此通过传送带从左向右运输。

我们可以看到Increase和Decrease二个UI按钮,它们会增大或减小家具生成速度和传送带速度,我们单击Play按钮运行场景。

我们可以看见,如下图所示,传送带正在移动,按钮也正常运行,但是没有生成任何对象。

020639d824pfgkfsw400zw

生成内容会从预设游戏对象的列表中随机选取,我们可以通过在层级窗口选中Furniture对象后,查看该对象的检视窗口,注意观察Furniture Spawner组件的Furniture Prefabs列表。

在TimeBetweenSpawns设定的时间过后,该组件会随机生成家具预制件。

020639ebol8e53ucbrv3vv.png.thumb.jpg

现在我们了解了场景,下面将介绍新预制件工作流程的核心概念,以及如何简化开发流程。

创建预制件
Unity中的预制件是预先配置可重用的游戏对象,我们可以在场景中创建预制件并保存在项目中。

创建预制件时,我们使用需要的组件,在场景中以合适的配置创建游戏对象,然后将游戏对象拖到项目窗口,将其保存为项目中的预制件。创建完成后,我们可以实例化和克隆预制件。预制件有很多用途,它是Unity开发中的重要组成部分。

创建完成后,游戏对象的名称颜色和图标都将变为蓝色,表示它已经被转换为预制件。

下面是本文项目的使用示例:
1、打开Assets \ RW \ Prefabs \ Furniture \ Pieces \ Chair目录,该文件夹中有很多组成椅子的不同部分变体。

2、在层级窗口中,创建空白游戏对象,命名为NewChair。

3、在项目窗口选中椅子的各个部分,将它们拖到新建的空白游戏对象上,将这些部分组合成椅子。完成这些步骤后,会得到下图效果。

020639rtu1z51881ne1778.png.thumb.jpg

4、向NewChair对象添加Box Collider组件和Rigidbody 组件,使它能处于场景中传送带的上方。

5、当前用于表示Box Collider碰撞体的绿线不符合椅子的实际大小,因此我们要选中NewChair游戏对象,然后选择Tools > Fit collider to children。

6、现在碰撞体完美符合椅子的边框,我们可以查看Assets / RW / Scripts / Editor中的FitColliderToMeshes.cs 脚本,了解该功能的实现方法,我们可以在项目中随意使用该脚本。

020640jxr25ygrxswuryyl.png.thumb.jpg

7、此时,NewChair只是当前场景中的一个普通游戏对象,为了将它转换为预制件,我们要把它拖到项目窗口的Prefabs文件夹中。

8、层级窗口的图标颜色变为蓝色,表示NewChair现在是一个预制件。

020640okik2kjgkriqg4k2.png.thumb.jpg

制作好预制件后,我们可以将它从层级窗口中删除,并在Unity项目的任意位置使用它。
1、从层级窗口删除NewChair预制件。

2、在层级窗口选中Furniture对象,在检视窗口中可以看到Furniture Prefabs是一个GameObject类型的数组。

3、在项目窗口选中刚刚制作好的NewChair预制件,将它添加到Furniture Prefabs列表。从项目窗口添加其它做好的预制件,例如Chair 1,Table 1等。

020640c6496gx3xxn36ns2.png.thumb.jpg

运行场景,我们刚刚添加的预制件就会生成出来,并在传送带上从左向右移动。

020640siwk7iik4krbziei-2

我们学习了如何制作基本的预制件,下面将开始探索预制件工作流程的全新核心功能。

预制件模式
全新的预制件模式是专用的预制件编辑模式,允许我们单独打开和编辑预制件。相较于把预制件拖入场景再进行编辑的旧方法,全新预制件模式会节省大量时间和工作。

我们有二种方法进入预制件模式:
1、在项目窗口双击预制件。
2、如果预制件是当前场景的一部分,我们将在层级窗口中的游戏对象旁边看见一个小箭头,单击该箭头会进入预制件模式。

使用上述任一方法都在场景窗口中打开预制件模式。请注意,此时层级窗口仅显示所选预制件的各部分游戏对象。

 020640dv5vjst7njlxjsvt.png.thumb.jpg-2

单击层级窗口中游戏对象左侧的左箭头,退出预制件模式。我们可以发现,进入和退出预制件模式的过程非常简单快捷。

预制件模式的自动保存功能
我们返回到场景中,在层级窗口选中Furniture对象,在检视窗口将Furniture Prefabs的Size值设为0,从而清除该列表中的所有对象。

我们把Table 1预制件从Assets \ RW \ Prefabs \ Furniture文件夹拖到列表中,从而添加该预制件。

020715bxgccerf2rrx8oxo.png.thumb.jpg-2

运行场景,现在只有Table 1的实例会生成到游戏窗口的传送带上。

020715yrmegme4bsxx2ryx.png.thumb.jpg-2

我们在场景运行时,项目窗口双击Table 1,在预制件模式打开它,然后增大或减小该预制件的Scale值。

我们会发现,随着我们调整预制件的属性,游戏窗口的实时环境中每个新生成的游戏对象会发生相应变化。

这种实时更新的效果源于预制件模式中全新的Auto Save自动保存功能。我们可以根据需要,通过场景视图右上角的复选框打开或关闭该功能。

020715ro0v1lrzb08r5hri.png.thumb.jpg-2

重写预制件
新预制件工作流程除了便捷的Auto Save自动保存功能,还允许我们重写预制件,即对指定预制件实例的特别修改,这些修改内容不属于对应预制件资源的一部分。

通过使用属性重写功能,我们可以创建拥有相同特点的预制件,同时这些预制件在特定条件下存在区别。换而言之,重写允许修改预制件实例的部分属性并保存改动,同时允许未修改的属性得到更新,并与预制件资源上的改动保持同步。

下面是重写预制件的示例:
1、将Table 1 预制件从项目窗口的Assets \ RW \ Prefabs \ Furniture文件夹拖到层级窗口,创建Table 1预制件的实例。单击该预制件旁边的箭头,在预制件编辑器打开它,然后关闭Auto Save功能。

2、选中子对象TableTop,在检视窗口中,展开Material选项,将使用的材质改为绿色。这样就创建了Table 1资源的预制件重写。

3、我们选中Tabletop部分,查看检视窗口,我们会注意到在修改过的属性前有蓝线,本项目中为Materials属性。在属性变化时,窗口中的属性文字会被加粗并在旁边显示蓝色竖线,表示属性已被重写。这样也使恢复特定改动的方法变得简单,而且不用撤销之前的所有操作。

020715c6ti1tkdt1iav333.png.thumb.jpg-2

4、这项改动只会影响预制件实例,如下图所示,我们可以通过Overrides下拉窗口管理所有对预制件实例的改动,单击Overrides可以查看被修改的属性列表。

5、单击列表中的游戏对象或组件会打开对比窗口,窗口左侧显示预制件资源的属性,窗口右侧显示重写后的属性。

020715awwfjotnbkuofkvt.png.thumb.jpg-2

6、我们可以在下拉窗口中,查看,应用或者恢复预制件的改动。单击Apply All可以保存所有改动,但目前,我们暂时不要应用任何改动。

7、我们打开Assets \ RW \ Prefabs \ Furniture文件夹,双击Table 1,在预制件模式中打开它。

8、我们选中Tabletop,将材质颜色修改为蓝色。此时场景中Tabletop的颜色没有变化,因为我们重写了该实例的属性。

9、然而,如果我们修改Tabletop资源的Scale 属性,即预制件编辑模式中打开的Scale属性,并单击Save,改动会使场景中由该预制件得到的实例产生变化。

这是一个如何在场景中重写预制件的示例。当场景中有游戏对象的实例时,而且我们希望修改预制件的特定属性,我们可以在不影响场景中整体预制件实例的同时进行修改。

进入下一部分学习前,我们先删除层级窗口的Table 1对象。

预制件嵌套
预制件嵌套功能允许你将预制件实例作为子对象包含在其它预制件中,同时仍保持与其自己的预制资产的关联。这项功可以使游戏更为模块化,非常实用。

下面是一个预制件嵌套功能的使用示例:
1、在项目窗口中打开Assets \ RW \ Prefabs \ Furniture目录,在预制件模式打开Table 1预制件。

2、在Furniture文件夹中有一个TableCloth预制件,我们将TableCloth预制件拖到层级窗口,使它成为Table 1预制件的子对象。我们将TableCloth的Rotation X值设为90,并修改Position Y值,使桌布正好在桌面上。单击Save保存预制件,我们会得到下图效果。

020715rnivsx22xwevtwhe.png.thumb.jpg-2

3、在预制件模式打开Table 2,将TableCloth预制件作为子对象添加到Table 2中,修改TableCloth预制件的Transform数值,使它正好处于桌子上方,保存Table 2预制件。

4、把Table 1和Table 2预制件拖入层级窗口,在当前场景创建二者的实例,调整它们的Transform值,使它们显示在游戏窗口的可见位置。

020716tnqs8q5vvleov75x.png.thumb.jpg-2

5、最后,在项目窗口双击TableCloth,从而在预制件编辑模式打开该预制件,增大或减小Scale值。

如果现在启用了Auto Save,我们会发现Table 1和Table 2虽然是二个独立的预制件,但它们上面的桌布大小会同时变化,因为它们都是继承自TableCloth预制件。

我们返回到层级窗口,删除场景中所有预制件Table 1,Table 2和TableCloth游戏对象,使项目保持整洁。

下面是另一个使用示例:
1、打开Assets \ RW \ Prefabs \ UI文件夹,我们会看见IncreaseButton和DecreaseButton预制件,它们是场景中使用的UI按钮。

2、在预制件模式打开IncreaseButton,将Assets \ RW \ Prefabs \ UI文件夹中的Arrow预制件作为子对象添加到IncreaseButton预制件,将它的Position修改为(X:150, Y:0, Z:0)。

3、我们对DecreaseButton预制件执行相同的操作,将它的Position修改为(X:-130, Y:0, Z:0),箭头的Rotation Z值设为180。

4、最后,在预制件模式打开Arrow预制件,将它的Scale调整为(X:0.75, Y:0.75, Z:1.0) 。修改后,IncreaseButton和DecreaseButton预制件实例的箭头大小会立即发生变化。

020716smqfnk2slyjxnll4.png.thumb.jpg-2

删除层级窗口中不必要的Arrow预制件实例,以保持项目整洁。

这就是Unity新预制件工作流程中预制件嵌套功能使用方法的简单介绍。在旧的预制件系统中,如果某个预制件是大量游戏对象的一部分,则必须手动选择该预制件的所有实例,才能使改动生效。

创建嵌套预制件的功能允许我们制作独立的模块,然后将它作为子对象添加给其它预制件,这样只需编辑一次主预制件,就能使改动在整个项目中生效。

预制件变体
预制件变体允许我们从预制件资源创建一个新的预制件。

预制件变体所基于的预制件被称为基础,预制件变体可以包含对基础预制件的重写,但仍会接受未重写属性的更新。

在关于预制件重写的部分中,我们学习了如何重写场景中预制件实例的特定属性,但有时我们可能希望创建二个或更多预制件的变体,使它们在整个项目中可以进行使用,但同时它们的部分属性和基础预制件不同,例如材质。

为此我们可以创建预制件的变体,它会继承基础预制件的所有属性,但可以单独调整特定属性。

下面是预制件变体的使用示例。现在项目中UI按钮IncreaseButton和DecreaseButton是二个独立的预制件,但它们有很多相同属性,使用其中一个预制件创建变体可以使维护过程更轻松。
1、在层级窗口中选择DecreaseButton,然后将其删除,打开Assets \ RW \ Prefabs \ UI,删除DecreaseButton资源。

2、创建IncreaseButton资源的变体,在项目窗口右键单击该资源,在弹出的菜单选择Create > Prefab Variant选项。预制件变体有带着二个箭头的特别图标,表示它是预制件变体。选中变体时,我们可以在检视窗口查看该变体所继承的基础预制件,我们将该变体重命名为DecreaseButton。

020716xt2tbwr88miq55gi.png.thumb.jpg-2

3、现在创建DecreaseButton的实例,我们将DecreaseButton拖到层级窗口的Canvas上,使实例成为Canvas的子对象,将实例位置设为(X:-390, Y:144, Z:0)。

4、我们在预制件编辑模式打开DecreaseButton预制件,禁用Auto Save选项。选中子对象Text,将文字设为Decrease。选中子对象Arrow,将它的Rotation Z值设为180,Position X值设为-150。

5、我们在场景窗口单击Save,保存改动。现在我们得到了IncreaseButton的预制件变体DecreaseButton,该变体的Text和Arrow游戏对象的部分属性和基础预制件不同。

我们可以在检视窗口单击Overrides下拉窗口,查看DecreaseButton重写了基础预制件的哪些属性。

020716sr8w7h0juu8puhaa.png.thumb.jpg-2

变体中没有被重写的修改,仍会随着基础预制件对应属性的改动而更新。为了证明这一点,我们可以进行如下操作:
1、在预制件编辑模式打开IncreaseButton,随意修改Text属性,例如改为Increase 123,然后单击Save,可以注意到这次改动没有对DecreaseButton预制件产生效果。

2、然而,如果我们修改IncreaseButton预制件中Text的Font size为38,改动也会在DecreaseButton预制件上生效,因为Font size属性没有在预制件变体DecreaseButton中重写。

我们退出预制件编辑模式,在层级窗口删除不必要的DecreaseButton预制件。选中Furniture游戏对象,添加NewChair,Table 2和Chair 1预制件到Furniture Prefabs列表,然后运行场景,效果如下图所示。

020717urcbzre7d7nn1trr-2

小结
我们已经完成了Unity 2018.3中新预制件工作流程的快速学习。本文的项目可以点击[阅读原文]进行下载,为了巩固学习的知识,你可以随意调整项目,尝试将本文介绍的不同功能结合起来使用。

微软将在今年底终止对 Windows Mobile 10 的支持

dims

Windows 10 Mobile 其实从推出到现在也才刚满三年的时间,但因为实在是没有什么机器采用这个系统,感觉好像已经很久没有听到它的相关消息了。一如 Joe Belfiore 先前所言,Windows 10 Mobile 已经不再是微软的一个重点项目,自然产品支持即将面临终止 — 微软宣布了软件和安全性更新将到今年 12 月 10 日为止 ,相关的技术支持也将同时结束。

在支持结束后,你还可以备份设备到 2020 年 3 月 10 日,部份服务像是照片上传、由备份回复等,还有机会再向后延长到 2020 年底。值得注意的是,12 月 10 的期限仅限安装 1709 版的用户,如果你是使用诸如 Lumia 640 或 Lumia 640XL 手机的话,1703 版是最后一个可用的版本,而其支持将在 6 月 11 日提前终止。详细的手机支持状况微软在这里有提供列表。

当然,在支持结束后,你还是可以继续使用你的 Windows 10 Mobile 手机,但微软建议该考虑看看 iOS 或 Android 系统了,毕竟微软在这两个平台上费了不少心思开发 App服务啊!当然,也别忘了 Android 上的 Launcher app 所提供的各种新功能呢。