Headless Substance | 无头Substance材质生成

Headless主要讲的是无人工无GUI参与的软件,中文翻译成无头总感觉怪怪的,暂且这样吧。

Substance套件作为当下游戏美术资产制作中,贴图制作这一环节的主流工具是相当成功的。其优点

  • 其一是方便美术在3D视角下绘制贴图,
  • 其二是可以利用程序纹理加快贴图制作效率。

本文探讨的是Headless Substance,即无人工无GUI参与的Substance贴图生成流程。当然这在大多数情况下并无必要,主流的生产管线中给美术做好程序纹理和SP智能材质模板就行了,然而这种方式仍然是人力密集的,并不方便scale up。本文希望探讨的技术可能对于以下应用场景有所帮助

  • 自动化批量处理贴图,比如转通道,转mask
  • 给模型加贴图
    • 比如高模(美术制作或扫描)自动生成可用的游戏资产
    • 程序化资产直接生成可用的游戏资产
    • 传统管线中部分特殊mask的自动化生成
    • 甚至UGC的资产生成?

当然也需要向读者指出的是,以上每个情景都可能有很多种技术方案,笔者这里探讨的仅仅是其中一种

读者肯定想到的是substance automation toolkit,本文也基本上是采用这种方法,笔者做的更多的是一个pipeline集成的工作以及范例资产的创建。

一番调研以后(参见后文案例研究篇),发现其实有蛮多方案了,比如在houdini里调用SAT或者直接执行sbsar,有给sat写了个界面的,官方甚至还有sat的dockerfile范例

然而笔者不太满意,笔者希望substance可以作为一个微服务运行在集群上,客户端通过网络协议与之交互。

技术选型上,SAT运行在docker上是官方证实的,所以我们就用docker配环境好了。网络协议上,考虑到SAT处理贴图的时间可能比较久,持续几分钟甚至更长,我们尝试使用websocket协议来发送请求和接收服务器的返回结果。最后,SAT怎么来?

其实订阅一下就行,在substance官网上订阅一个pro/indie版本,就能看到SAT的下载链接。好在SAT本身是不需要license审查的。

项目代码在https://github.com/maajor/docker-sat,不包含houdini模型案例,只有服务器和客户端本身

1 技术实现

1.1 Dockerfile

首先笔者假定读者有一定Docker的基础知识,这里就不介绍了。为了让SAT可以运行,我们得装一些依赖包,比如libglu之类的图形库。官方的dockerfile里已经写好了 

笔者写的有点类似

这其中有一个奥妙是装了xvfb。要不然的话,sbsbaker需要去找framebuffer但是找不到,而xvfb提供了一个虚拟的framebuffer,参考 这个主题-run-qt-gui-application-inside-docker

因此docker启动时必须带一个命令,让xvfb创建一个虚拟屏幕

1.2 SAT


参考官方文档https://docs.substance3d.com/sat,其主要功能主要有两个

  • sbsbaker,烘焙贴图,类似substance designer/painter里的贴图烘焙功能
  • sbsrender,用sbsar节点图处理贴图

其他的感觉用处不大。

使用上有两种,一种是CLI命令行模式,可以将参数传入命令行执行。另一种是官方自带的Pysbs包,通过python调用。不过阅读源码发现其实也就是起了一个subprocess执行命令行调用。

具体使用方法这里就不细说了,直接参考官方文档就行。

值得注意的一点是,sbsbaker除了支持单个通道烘焙的函数调用(比如sbsbaker_position_from_mesh)外,还有一个sbsbaker_run的函数,可以一次烘焙很多贴图。它接受一个json配置文件。而这个json配置文件是可以从substance designer中导出的。笔者也用的是这个方式,运行时拼装一个json配置文件,然后运行sbsbaker_run

1.3 Server

这个服务有几个特点

  • 客户端给出请求以后,服务器是可以多次推送回状态和消息的
  • 上传和下载的数据量可能比较大,几十上百兆
  • 连接比较长,服务器处理可能持续几分钟

这时相比于Restful HTTP,使用websocket可能是更好的选择,借用一张Azure的图比较它们的区别,websocket相比于HTTP

  • 连接可以比较久
  • 双向互相传输数据
  • 每次请求overhead比较少

比较适合这个场景,所以我们选择websocket作为通信协议。WebSocket support in Azure Application Gateway | Microsoft Docs

图片来: Microsoft Docs

题外话是通信协议的另一种选择是gRPC,不过依赖有点多而我们希望甚至DCC里也能调用,所以先算了。

这样带来的一个直接好处是,可以更好支持泛型,比如服务器可以先接受一个manifest再接受其他数据,task运行完以后,给客户端推送结果也可以是泛型的

写好以后就可以打包进docker,我们写一个docker-compose文件以后,build就变得很简单,直接

就可以了

然后通过以下命令启动这个微服务

具体代码参考笔者Github代码库https://github.com/maajor/docker-sat

1.4 Client

客户端需要一个websocket库,笔者这里使用的是websocket-client这个库,它还算简单,而且支持到python2.7

和服务器一样,由于接受参数比较自由,对于sbsrender的调用,客户端方法的签名甚至可以使用

这样sbsrender我们可以用一个函数来支持。

不过仍然有一点问题,在传输大文件时候仍然需要切块。否则传输的payload会爆。但用websocket的好处是切块也很方便

具体代码参考笔者Github  https://github.com/maajor/docker-sat/blob/main/client/satclient.py

2 实验

在Substance中做自动处理贴图的主要方式就是用position,normal,ao,curvature,id之类的图,来生成与创建mask,以及混合贴图。下面两个案例即是如此

这里尝试了一个voronoi车的建模,高模和低模是houdini中生成,贴图使用SAT自动处理。不局限于程序化生成的模型,任何已有高模(手工雕刻,扫描),都可以用类似的方法处理使之成为游戏内资产。

图片来源:笔者自绘

建模的部分不细说,主要参考Siggraph Asia2018上, Akira Saito的讲座Procedural Hard Surface Design

图片来源:Akira Saito

具体步骤就跟Saito桑讲的一样,没有太多原理上复杂的东西。

图片来源:笔者自绘

而后在贴图部分,需要烘焙AO, ID, Normal三张图,在SD中做处理,主要操作就是用ID混合一些材质,导出一个sbsar的文件

图片来源:笔者自绘

在叠加上烘焙出来的法线,AO

图片来源:笔者自绘
图片来源:笔者自绘

用来生成贴图的只是一小段代码,这里做了八套贴图。这里高模低模是Houdini存储出来的。

连接上本地docker中运行的SAT服务,上传模型和sbsar让它烘焙就行了最后就是这一套车子

图片来源:笔者自绘

3 总结

本文探讨了一种使用Substance处理贴图的流程。

在流程层面,substance是微服务化的。生产中可以怎么方便怎么来,比如集成到Houdini PDG,直接从引擎中调用等等。微服务化的主要好处是方便部署和扩容,可以上云。

在制作层面,主要是利用ID/几何信息,使用程序化纹理生成mask的方式制作贴图,可以用在任意已经有高模的资产的情况下。一个案例是给houdini程序化模型上材质。

本文没有讨论模型资产的自动化流程,但案例中低模UV都是houdini自动生成的。实现上完全可以让houdini也无头化成为一个资产处理的微服务。

本文仅代表个人研究,自己编写的服务器和SAT使用过程中有一些bug,仅供探讨,在生产环境中使用出现问题笔者概不负责:)

附录:案例研究

sat_batchtools_gpu_free

官方的一个dockerfile,可以让SAT运行在linux docker image中,对本文相当有启发不过readme中如果没有sat使用经验的话容易搞不懂它到底干了啥。AllegorithmicSAS/sat_batchtools_gpu_free: A Docker alternative to use batchtools without GPUs. (github.com)
笔者总结一下,它

  1. 让sat可以运行在没有gpu的虚拟机上,这就为sat上云创造了可行性
  2. 有一个CLI入口可以执行各种sat的功能

sat-scon

这个很有意思做了一个资产自动构建的项目,用sat生成缩略图,可以理解成一个buildmachineAllegorithmicSAS/sat-scons: A sample showing how using the Substance Automation Toolkit together with the scons build system to do incremental content builds. (github.com)

substance designer batch tool

读者如果看substance designer的安装目录下面有一个sbscooker,其实跟SAT的sbs cooker是一样的。只不过缺少sbsbakerSubstance Designer: Batch Tools | jason brackman’s (wordpress.com)

substance uber baker

Substance Uber Baker (orbolt.com)其实就是在houdini里调用sat的一个接口节点

substance in houdinisidefx

官方gamedevelopmenttool的工具,在COP中可以调用sbsar文档来处理贴图好像不依赖substance还不错,只不过有时候会崩溃

sat in houdini

江流大佬做的是在houdini里面调用SAT的apihttps://zhuanlan.zhihu.com/p/107424364

Tops + SAT

HQueue + TOPs +Substance Automation Tool kitでテクスチャをベイクする! – Born Digital サポート用houdini的农场来调用SAT,蛮像影视工作室的方案,渲染农场可不是谁都有的

基本是在讲怎么用SAT的API Substance Automation Toolkitによる簡単自動化 – もんしょの巣穴ブログ Ver2.0 (hatenablog.com)

欢迎关注微信公众号:码工图形

发表评论

邮箱地址不会被公开。 必填项已用*标注