【程序化工作流的优化】打通Unity,Houdini,Substance Painter之间的墙 效果演示 演示视频:【【Unity+Houdini+Substance Painter】PCG建模自动化流程演示】 【Unity+Houdini+Substance Painter】PCG建模自动化流程演示_哔哩哔哩_bilibili 前言 本文简单聊聊基于unity,houdini,substance painter的程序化工作流,然后再聊聊贯穿三者的工作流优化。 我自己的建模PCG流程 看到标题有houdini和substance的朋友应该知道要优化的这个工作流肯定是PCG。 建模流程顺序是Houdini制作HDA后,输出模型,法线图,材质ID图。然后全部导入substance painter里,依据材质ID图,布置好各个材质。确定好材质遮罩都正确无误之后,保存材质合成用的spp项目文件,并且输出各纹理,一般是PBR的那套输出。当然输出的纹理颜色通道合成格式,根据unity内的材质需求而定,颜色通道合成格式的设置这一步也在spp制作中完成。最后一步,就是把模型文件(fbx)和纹理贴图(png)导入unity工程,设置好材质就完成了。
这个工作流很繁琐,因为要在三个软件之间来回切换。houdini做好hda,导出模型,遮罩纹理。再打开SubPainter,导入模型纹理,根据材质ID的遮罩把对应的材质赋上去,如果有颜色需求还要对应改颜色。弄好之后,再导出最终的贴图纹理。然后再打开unity把hda,模型,纹理贴图导进unity,创建正确的材质再添加给预制体或者mesh。到这一步还只是第一次的预览完成,后续调整HDA时uv展开一改变就又要跑一遍上述过程。 整个过程过于繁琐,而且houdini和subPainter在第一次工程创建配置好之后,要做的修改都非常少,基本只有点几个按钮,然后导入导出资源的操作。 那么作为一个程序员,就非常有义务优化这个工作流程。我希望达到的效果是,在制作好HDA,SPP项目文件和prefab预制体之后,在unity环境下调整HDA参数,然后只要一个按钮就自动跑通流程,不需要切换软件界面,直接在unity的scene窗口看到模型更新且材质,纹理,UV都正确。 了解完需求,那么只需要按步骤实现功能即可。 各软件的自动化 Houdni: 导出fbx模型,材质id映射贴图,法线贴图。 通过hda的scripting,使用python编写需求:主动触发烘焙模型的rop_fbx节点的save to disc按钮,烘焙法线和材质id映射的rop_render节点的bake按钮。 我的做法是把3个导出资源用的节点在HDA的scripting的python module中,执行触发按钮的操作: SubPainter: 更新fbx模型和材质id映射贴图,然后烘焙导出新贴图 SubPainter官方提供了Python API和Remote Scripting模式,这两个工具可以帮助用户实现自动化。如果要从外部通信SubPainter调用他的PythonAPI,必须使用Remote Scripting选项启动SubPainter。官方文档给出了启动用的shell指令。我的做法是把指令编写成ps1,然后unity内c#脚本运行这个ps1文件。 启动完成后,便可以在外部用Python操作了。特别提醒,有些旧版本SubPainter的Python API不全,关于模型Mesh的操作等一些接口是没有的。我直接买了steam版本的Sub3DPainter2023.虽然更贵,但是方便。存steam库里随用随下,不用记序列码。如果是想跟着本文搭建工作流,建议使用最新版本,或者2022大版本的SubPainter 为了方便大家看代码,我就不拿remote模式下的python代码讲解,先用常规用法(SubPainter内的python指令)介绍每一步操作。 1.准备工作:打开spp工程文件 2.导入需要更新的模型 3.导入新纹理:材质ID映射图,高模烘焙过的法线贴图 这里是可以自行选择在Houdini里烘焙高模法线,还是subPainter里烘焙。我用的是houdini的烘焙,原因是不会产生高模这个中间产物。而且一般高模的文件大小都动辄十几,甚至几百mb。 4.更换工程id映射,法线纹理为导入的新纹理 5.烘焙最终的PBR(不一定是PBR,根据实际情况而定)材质贴图 Unity: 搜刮之前的生产出来资源,进行组装 这一步是最简单的(对于我这个写了很多Unity编辑器的人而言,python和powershell不熟,写的真的很辛苦)。创建场景内GameObject的,添加mesh相关的组件,然后生成材质(设置shader,设置纹理贴图)放到模型上。大功告成。 软件之间的通信 每个软件各自的通信是实现整个流程自动化的重要一环。只有通信建立了,才能让整个工作流无缝衔接。打通Unity,Houdini,Substance Painter之间的墙,最关键的就是建立通信。 一般比较重视开发向用户的公司,他们的产品都会提供远程操作(或者,供命令行调用的参数配置)的接口。houdini和substance系列的产品都有官方提供的remote scripting手段。那么根据需求,我要实现unity与houdini的双向通信,unity和subPainter的双向通信。 建立unity本地服务器 unity使用socket建立tcp服务,接受客户端(houdini,subPainter)的命令。 Houdini的本地远程操作 我使用了houdini官方提供的Python Scripting中的RPC方案,用来实现参数同步和资源生产的启动。 可能有人会问,参数同步为什么不用houdini engine自带的session sync呢?我也想用啊,官方演示的效果也很好,我拿了unity新手包里的hda测试session sync用下来感觉也很好。但是,session sync只要加载我自己制作的某些hda,Houdini就直接卡死,然后Unity也跟着卡死,最后我也卡死。我去sidefx的houdini社区里找解决方案,发现有跟我一样遇到这个问题的几位兄弟,但是那个帖子都两年了也没有相关人员或者社区好兄弟sigusoft个解决方案。我也没辙,我唯一能确定的就是这个bug是hda里的某些节点或者参数导致的。但是我不可能削足适履,反过来改我的hda啊。官方对houdini engine 的态度又一直处于摆烂的状态(Unreal那边还算好的,毕竟都成兄弟,Houdini Engine for Unreal还在持续维护和更新,unity这边真的和弃婴一样)。 所以我干脆直接放弃session sync,自己手动做参数同步。原本我打算在houdini里自己写tcp客户端接受指令,还好houdini有最后一丝的怜悯有个官方封装好的RPC方案。省了一大堆工作量。houdini官方RPC方案文档:RPC (sidefx.com) rpc干两件事:同步参数到houdini(包括生成hda实例) 2. 启动资源生产 Substance Painter的远程操作 Adobe官方文档给出了SubPainter的远程使用说明,还给了案例,非常清楚。官方文档:Remote control with scripting | Substance 3D Painter (adobe.com) 总共3步: 1.Remote Scripting模式启动Substance Painter 可以使用power shell或者System.Diagnostics来执行启动指令。 2. 建立remote服务器 非常简单,复制官方文档提供的lib_remote 作为模块保存即可
port端口显示连接的是60041 这里提一下,官方没有明说port自选,默认了60041。就是说Unity Server的port需要避开60041。当然,最好的方式是lib_remote的port也由我们自己控制。 3.使用远程指令调用SubPainter的python api 上文SubPainter自动化的部分中提到了“我没拿remote下的python代码做介绍”,现在介绍把自动化代码remote执行的手段。下面拿打开spp工程文件为例子: 小结 到这里整个自动化流程的所有要素就都完成了。那现在我简单聊一下我想到这个自动化工作流的契机。 我在使用Substance Painter的时候发现他的mesh map中的ID Map(也就是材质映射用的颜色遮罩),在更新id纹理后,原本项目通道里的基于id map的mask都对应自动更新了。于是我就想,这么方便不做材质纹理的自动化生成太可惜了。原本以为整个自动化的搭建过程中,Substance Painter部分最难处理,结果,Houdini成功的用Houdini Engine For Unity告诉了——没事儿的话,少碰这几把玩意儿。 整个过程我断断续续的搞了一周,上班摸鱼也搞,结果subPainter和Unity的部分加在一块儿也就两晚上调通,剩下五天我都在被这弱智session sync折磨,想破头的给他找替代方案。到最后真被气笑了。 工作流的缺陷与不足 这个自动化工作流是针对程序化建模师的,所以不考虑材质的生产,但是要考虑材质的分布和使用。这一点Substance Painter已经帮助解决大半了。但是有一个问题我在搭建时没有想到比较好的处理方案:贴花。 用过Substance Painter的兄弟应该都知道他提供了贴花的功能。贴花能够丰富模型的细节,特别是一些机甲,喜欢贴一些工业标签增加机械美感。 但这个贴花是在Substance Painter里做的,意味着我无法编辑和自适应。因为整个自动化工作流,只有启动前的参数控制,而参数只影响hda的部分,整个sub painter在工作流的第一次搭建完成之后都是黑箱状态,无法干预。 对于这个问题,我尝试了在houdini中创建针对贴花的mask纹理,然后和id map合并,再在substance painter中识别使用。这个方法确实在houdini中完成了贴花,但我的手段有限,导致贴花的mask很糊,有明显锯齿。整体效果还是没法和subpainter里的贴花比。 另一个缺陷是我本人目前对houdini engine的session sync参数同步还没有完全解析完。像curve,多维参数(Vector3,Vector2),等等这些类型的参数,我还不知道怎么规范参数的传入。所以如果hda的参数包含Curve等类型,就不会被同步到houdini的hda节点中。这个缺陷还算容易弥补,之后慢慢自己琢磨就行了。 后续 这个工作流之后我会整理到我之前的开源插件里(【Unity + Houdini 插件】HDA助手 – 知乎 (zhihu.com))。现在的版本还有不少中间变量和参数没有做到通用兼容,还需要整理和规范。应该过几天会更新插件。 最后说明一点 ,这个自动化工作流是我臆想的程序化建模师的工作流,我不清楚现在一些实际应用和生产里是不是这样的逻辑。所以本文只能作为参考。如果你对这个自动化工作流的搭建感兴趣,欢迎一起讨论。
PCG交流群:
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/84201.html