【转载】Substance in Unity

594 阅读5分钟

原文链接

Substance in Unity | taecg

原文写得很好,但是主题格式我不太喜欢,所以我对文章的格式进行了修整,方便自己日后阅读

前言

随着 PBR 的流行与普及,Substance 工具流也逐渐变得普及开来,那么本文就来聊一聊有关 Substance Designer 制作的程序化贴图如何在Unity中来跑通流程。

Substance Designer 简介

Substance Designer 是 Adobe 大家族(2019 年 Adobe 从 Allegorithmic 收购) 中的一个神奇的 CG 软件(以下简称 SD),它打破了传统的美术绘制纹理的方式,在不动用一笔一画的情况下就可以制作出非常精艳的纹理效果,而且还可以拥有各种动态的参数便于随时生成不同的效果与变体。

让我们一起来随便欣赏几个案例:
(都是 Substance Source 中的资源,A 站也有好多非常棒的效果,就不贴出来了)

Substance Designer 可以保存两种格式的文件:

  1. sbs
    相当于 3ds Max 的 .max 格式,原始论文件。
  2. sbsar
    Substance Designer 导出给其它应用软件的格式,有点类似于于 3ds Max 导出的 .FBX 格式,但是导出的 sbsar 只能在现有给定的参数上进行调节,无法更改它本身的内容.

插件集成

我们可以在 Unity 中以两种方式来使用 SD 生成的纹理

  1. 直接以传统纹理的方式
    利用 SD 直接导出纹理或者在 Unity 中从 sbsar 上导出纹理都可以,这种方式只是把 SD 当成纯作图工作来使用,并没有使用到程序化参数的概念。
  2. 程序化纹理使用的方式
    利用 Allegorithmic 官方出品的插件,集成进 Unity 中,在 Unity 中使用可动态调整的程序化纹理。

不管是以上哪种方式,我们都需要在 Unity 中集成一个插件:Substance In Unity,所以呢,我们先来安装一下这个插件。

先从 AssetStore 中下载插件(免费的)

然后将下载好的 package 包导入 Unity 中,完成后,会在菜单栏看到多了一个 Substance 的选项。

image.png

此菜单项下的说明:

  1. About: 关于插件版本的简介
  2. Preferences: 插件通用设置相关
  3. Substance Source: 官方的材质库,平常是在网页上和 Substance Launcher 上查看的,安装了此插件后,也可以在 Unity 内部查看使用了.
  • Substance Launcher image.png

  • Unity image.png

引擎使用

OK, 一切准备就绪后,现在让我们来看看如何在 Unity 中使用程序化纹理.

首先把你的 sbsar 格式的文件拖入到 Unity 中(我这里以在 Substance Source 中下载的 Ocean Islands 为例).

然后我们在 Project 面板中选中,在 Inspector 面板会显示如下:

image.png

图示中的 1234 分别为:

  • 材质球
  • 纹理贴图
  • Graph
  • 变体

我们依次来看下

Material

很好理解,和我们在 Unity 中使用的材质球一样,默认是 Standard Shader。可以通过最上方的 Shader 更换自己需要的 Shader.

Textures

一张张纹理,由我们在 SD 中设置的纹理输出类型决定。

image.png

Graph

程序化纹理的参数调节全在这里,我们在 SD 中曝露的属性也都会在这个面板显示出来。

所以 很好的一种方式 是导入 Unity 中为 sbsar 格式的文件,然后在此面板搭配场景细微调整自己需要的效果。

同时如果只是想单纯的使用纹理的话,也可以在这个面板中烘焙(通过 Bake textures to folder 按钮),将真正的变成文件夹中的一张张纹理。

变体

假如我们希望由一个 sbsar 文件生成数个材质球供不同的物体使用(这种需求很常见),这个时候变体就派上用场了.

通过在变体面板中点击 + 号来生成新的一个变体,然后选中它就可以像上面 123 步骤一样的去控制这个变体效果了。

image.png

运行时动态生成

除了在 Unity 编辑器下控制参数以外,我们还可以在游戏打包到指定平台上运行时通过代码动态的去调整参数。

控制的脚本须引入 Substance 的命名空间

using Substance.Game;

然后通过以下方法来动态更改:

mySubstance.Set... //有好多 Set,自己看着用
mySubstance.QueueForRender ();
Substance.Game.Substance.RenderSubstancesAsync ();

不过这种情况下,会产生延迟,具体时间取决于你的硬件性能,因为图片的动态生成需要时间。

就拿上面的案例,我在小米 Max2 手机上动态生成花了近 10 秒钟.....

性能方面

如果你需要在游戏运行时生成纹理的话,那么一定要注意 SD 中节点的耗时,这会直接影响运行时生成的时间。

SD 虽说是程序化的数据,但是在游戏运行时,内存中还是一张张的纹理,这和传统的纹理内存并没有什么不一样。

如下图中发布到手机上时 Profile 内存的情况:

image.png

另外,我记得之前用 SD 的 sbsar 格式可以大大的减小包体大小,也就是说在打包时并不会生成纹理,而只是存储的很小的程序化数据,关于这点,近期测试的结果并不是这样,我特意打完包并解包发现其中已经有纹理了。

所以这点上有点不太清楚是改版后的原因(插件版本是 2.4.3 )还是哪里设置的问题,有知道的还请告之一下。

总结

最后来说下 SD 的优点:

  • 纯程序化纹理,迭代方面,效果出众
  • 纹理分辨率可控,随意调节
  • 纹理可动态调节参数,动态变化
  • 自动生成所有需要的纹理(比如法线、AO等等)

那既然有这么多优点,那我们还等什么呢?抓紧学起来呀!