前言

在影视或者游戏行业中,由于不同的项目有着不同的需求,因此在专业工作室和公司中,往往需要根据项目的要求使用特定的软件和插件,甚至于严格限定使用的软件和插件具体版本,同时由于项目往往是并行运作,因此常常会出现制作人员需要频繁切换软件和插件版本的情况。

软件版本的切换,最简单的方式就是在电脑上安装好软件的不同版本,根据需求启动所需版本;而由于安装位置冲突,同一插件的不同版本一般是不能同时安装共存的,如果采用安装包的方式将插件安装到默认安装目录下的话,在切换插件时就需要不断卸载重装,特别是制作团队规模很大时,这样做既浪费时间,又容易出现切换失败等异常问题。

因此,绝大多数的DCC软件都支持自定义插件加载的位置,这样就可以将插件安装到一个中心化的共享服务器上,在DCC软件启动时,通过环境变量或者配置文件指定要加载的插件路径,从而以远程读取方式加载到所需的插件。

这样一来,只需要把需要的插件文件以特定方式整理到插件服务器上即可,在更改插件种类和版本时,无需修改插件服务器的内容,只更改制作人员电脑上的环境变量和配置文件即可(这一步一般是通过TD们开发的流程工具自动实现,制作人员只需要选择工程名称即可),所有制作人员使用的插件都是同一份文件,达到快速部署和更新,提高效率和稳定性的目的。

因此,今天开始就用两三篇文章整理一下各种常用DCC软件的插件远程加载方式和一些实现的细节,首先就是3dsMax。

 

3dsMax的插件加载原理

3dsMax作为效果图、影视、游戏行业常用的DCC软件之一,要想发挥它强大的功能,离不开各种第三方的插件,其中简单的如FloorGenerator等建模辅助插件,复杂的如Forest Pack Pro等植被散布插件和fumefx等特效类插件,甚至于VRay、Corona等第三方渲染器插件。

 

插件免安装原理

首先通过一个简单的FloorGenerator插件,观察一下3dsMax的插件安装原理。

可以看到,在安装插件后3dsmax的安装目录下的Plugins文件夹下,多了一个FloorGenerator_max2018_64bit.dlm文件,这就是插件的主体文件,如果将这个dlm文件直接复制到另一个电脑上的相应路径下,另一个电脑也就能成功加载此插件了。

实际上,很多插件安装包的主要功能其实就只是寻找3dsMax安装路径并将特定文件复制到Plugins文件夹下而已。

因此,Plugins文件夹可以称为3dsMax的默认插件加载路径,只要将插件的主体文件放在这个默认插件加载路径中,就可以实现免安装加载插件。

 

插件远程加载原理

只是实现了插件文件的免安装加载还不够,为了实现插件的中心化管理,需要将插件文件放置在共享服务器上。

那么怎么实现呢?

最简单的方式就是通过文件链接功能,将远端的插件文件在默认插件加载路径下生成文件链接,CMD命令如下

mklink C:\Program Files\Autodesk\3ds Max 2018\Plugins\FloorGenerator_max2018_64bit.dlm Z:\3dsMaxPlugins\FloorGenerator\2018\FloorGenerator_max2018_64bit.dlm 

文件链接的具体使用方式可以去我以前发过的mklink链接使用一文中查看,实现的效果如下。

文件链接其实就是文件的快捷方式,可以看到文件大小为0KB,类型为.symlink,而对于3dsMax来说,能够正常识别到默认插件加载路径下有FloorGenerator_max2018_64bit.dlm这样一个插件文件,但实际加载到的则是远端的插件文件。

 

高级远程加载原理

通过前面的文件链接方式,虽然可以实现插件的远程加载,但仍不算最佳方案。

在有些情况下,制作人员可能有并行工作的需求,即同时进行多个不同的项目,需要同时打开两个相同的软件但加载不同的插件。

而在这种情况下,由于已经开启的软件会锁定已经加载的插件文件,此时是不能对本地的FloorGenerator_max2018_64bit.dlm这样的插件文件进行修改或者删除的。

根本原因是多开同一版本的3dsMax软件时,读取的是同一个默认插件加载路径,因此会产生冲突。要解决这个问题,就需要让软件在每次启动时拥有自己独立的插件加载路径。

那么3dsMax是怎么实现自定义插件加载路径的呢?

首先需要找到下面这个3dsMax用户配置文件夹

C:\Users\电脑账户名\AppData\Local\Autodesk\3dsMax\软件版本 - 64bit\软件语言
//或者%localappdata%\Autodesk\3dsMax\软件版本 - 64bit\软件语言

例如,在我的电脑上,使用3dsMax2018英文版时,对应的路径是C:\Users\yumefx\AppData\Local\Autodesk\3dsMax\2018 - 64bit\ENU,其中AppData文件夹默认是隐藏的,需要在文件窗口的查看菜单中勾选隐藏的项目才能看到。

找到这个用户配置文件夹中的Plugin.UserSettings.ini文件,如果找不到该文件夹或者文件的话,可以重新启动一下对应语言和版本的3dsMax软件,该文件内容如下:

其中Additional Max plug-ins这一行的文件路径想必很眼熟,没错,这就是前面说的默认插件加载路径。那么在这个文件里新增别的文件路径是不是就能远程加载插件了呢?

我们添加一个路径试试。

再打开软件就可以看到插件已经成功加载了。

注意插件管理窗口下方Load Path一栏的最后一行,其实就是对应我们在Additional Max plug-ins文件中新增的一行,而第一列的列名是Description(描述),这意味着在填写Additional Max plug-ins文件时,=号左侧的键名是没有严格要求的,只要不重名且方便识别,可以任意命名,只要=号右侧的插件加载路径填写正确即可。

除了这个Plugin.UserSettings.ini配置文件以外,实际上在3dsMax安装目录下,对应不同语言的文件夹下也有名为plugin.ini的配置文件(英文版软件为en-US文件夹,中文版软件为zh-CN文件夹),在其中添加插件加载路径也可以实现一样的效果。

当然,看到这里,你也许会说,这个ini配置文件不还是共用的吗,对于软件多开有用吗?

事实上是可以的,因为这个ini配置文件只在3dsMax启动时会加载,软件使用过程中不会被锁定,完全可以在打开软件的情况下修改插件和多开启动。

当然,这样毕竟还是有点low,有没有办法把这个插件配置独立出来,每次启动时加载默认的配置,再加载独立的配置?

那必须有,直接在任意路径下新建一个ini格式的文件,文件名随意,内容如下:

[Directories]
Floor Generator plug-ins=Z:\3dsMaxPlugins\FloorGenerator\2018

其实就是将默认的Plugin.UserSettings.ini配置文件格式抄下来,单独存放,注意[Directories]这个section一定不要漏掉。

加载这个配置文件的方式就是在启动3dsMax时,在exe后面添加一个-p参数,后面跟上这个自定义配置文件的路径,例如:

"C:\Program Files\Autodesk\3ds Max 2018\3dsmax.exe" -p "C:\yumefx\CustomPlugins.ini"

查看官方文档的命令行参数可知,-p参数实际上就是使用自定义的ini文件替换上面说到的3dsMax安装目录下的plugin.ini配置文件进行启动,这样就可以实现多开软件时,每个窗口都会加载一个公用的Plugin.UserSettings.ini配置文件和自己独有的CustomPlugins.ini配置文件,从而实现灵活地加载不同的插件。

 

环境变量的使用

上面的加载方式看起来似乎已经没有问题了,但依然不够完整,对于早期版本的3dsMax软件或者结构比较复杂的插件例如VRay3.60.03版本插件,就会遇到下面这样的报错。

报错信息是在加载插件时找不到所需的动态链接库也就是dll文件,这是怎么回事?

其实很简单,3dsMax的插件加载不只需要配置文件,还需要环境变量,最重要的就是PATH环境变量

简单来说,ini配置文件决定了3dsMax启动时要加载的插件位置,而PATH环境变量决定了当加载过程中需要寻找一些动态链接库等文件时需要在哪里寻找

而使用默认插件加载路径时不需要加PATH环境变量的原因是3dsMax默认会自动到3dsMax安装目录下寻找,所以不需要再添加。

对于VRay3.60.03版本来说,它的插件文件不只有plugins文件夹下的主体文件,还会有很多辅助文件,如下图

由于Vray渲染器插件功能复杂,因此需要加载这些dll格式的动态链接库文件才能正常使用。

因此需要在PATH环境变量中新增这些dll文件所在文件夹的路径,如下

不过这样修改Windows的环境变量毕竟还是过于呆板,完全可以通过Python或者cmd命令临时修改环境变量,只对当前软件进程生效,不影响其他软件。

例如Python临时修改PATH环境变量代码如下:

import os
os.environ["PATH"] = os.environ["PATH"] + r";Z:\3dsMaxPlugins\VRay_3.60.03\2018"

使用CMD临时修改环境变量如下:

set PATH=%PATH%;Z:\3dsMaxPlugins\VRay_3.60.03\2018

ini配置文件加上PATH环境变量,这样才是完整的插件加载方式。

不过对于VRay这样的复杂插件来说,往往会需要更多的加载信息,比如多条ini配置文件和多个环境变量,否则会导致插件加载失败或者加载时缺少部分功能。

这些加载信息,可以在使用安装包安装时,对比前面说到的Plugin.UserSettings.iniPlugin.ini以及系统的环境变量的前后变化得到,再配合上PATH环境变量就可以正确加载插件了。

以VRay3.60.03举例,完整的ini配置如下

完整的环境变量配置如下

PATH=Z:\3dsMaxPlugins\VRay_3.60.03\2018
VRAY_OSL_PATH_3DSMAX2018_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\3dsmax 2018 for x64\opensl
VRAY_MDL_PATH_3DSMAX2018_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\3dsmax 2018 for x64\mdl
VRAY30_RT_FOR_3DSMAX2018_MAIN_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\RT for 3ds Max 2018 for x64\bin
VRAY30_RT_FOR_3DSMAX2018_PLUGINS_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\RT for 3ds Max 2018 for x64\bin\plugins
VRAY_STARTUPSCRIPT_PATH=Z:\3dsMaxPlugins\VRay_3.60.03\scripts\Startup

其中第1条是必要的PATH环境变量,第2、3条是加载额外模块的环境变量,第4、5条是加载VRay RT这一GPU渲染器的环境变量,第6条则是加载VRay自带的自启动脚本的环境变量。

其中V-Ray这个文件夹使用安装包安装插件时默认情况下会安装到C:\Program Files\Chaos Group文件夹下,同样需要整理到插件服务器上。

不过需要注意的的是VRay不同的大版本环境变量会有一定变化,不能照抄,需要逐个版本测试整理。

 

多个插件同时加载

对于多个插件同时加载的情况,ini配置文件中由于键名可以自定义,因此不会出现键名重复,可以多行并列方式;而环境变量由于变量名不能任意修改,肯定会出现两个插件的部分变量名相同的情况(例如插件默认的PATH环境变量),这种时候需要把同名环境变量合并成一个环境变量,键值之间用分号隔开(Windows环境变量本身就是这么处理同名变量的)。

例如同时加载VRay和FloorGenerator插件时,ini配置文件内容如下

[Directories]
Vray Main plug-ins=Z:\3dsMaxPlugins\VRay_3.60.03\2018\plugins
Vray Additional plug-ins=Z:\3dsMaxPlugins\VRay_3.60.03\2018\Plugins\vrayplugins
VRay Additional Startup Scripts=Z:\3dsMaxPlugins\VRay_3.60.03\2018\scripts
Floor Generator plug-ins=Z:\3dsMaxPlugins\FloorGenerator\2018

环境变量如下

PATH=Z:\3dsMaxPlugins\VRay_3.60.03\2018;Z:\3dsMaxPlugins\FloorGenerator\2018
VRAY_OSL_PATH_3DSMAX2018_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\3dsmax 2018 for x64\opensl
VRAY_MDL_PATH_3DSMAX2018_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\3dsmax 2018 for x64\mdl
VRAY30_RT_FOR_3DSMAX2018_MAIN_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\RT for 3ds Max 2018 for x64\bin
VRAY30_RT_FOR_3DSMAX2018_PLUGINS_x64=Z:\3dsMaxPlugins\VRay_3.60.03\V-Ray\RT for 3ds Max 2018 for x64\bin\plugins
VRAY_STARTUPSCRIPT_PATH=Z:\3dsMaxPlugins\VRay_3.60.03\scripts\Startup

 

辅助手段

对于个别插件来说,很多时候额外文件不只是dll格式的动态链接库文件,例如FStorm这一GPU渲染器插件,它的辅助文件如下。

可以看到除了dll格式的动态链接库文件以外还有一个FStormRender.bin的文件,如果不能正确加载这个文件,会导致渲染失败,而这个文件显然是不能通过PATH环境变量指定查找路径的。

因此这个时候就需要配合辅助手段加载插件了,例如自动拷贝或者自动生成文件链接等,保证软件启动时能在3dsMax安装目录下找到这个插件额外文件。

除了FStorm插件外,还有MultiScatter、早期版本的CoronaRenderer等插件都有类似的需求。

除了这种情况以外,还有部分插件需要添加注册表(例如Forest Pack Pro森林插件)、添加注册信息(例如购买的插件序列号或者许可文件等)的需求。

因此在插件服务器上添加一个新插件的流程为测试安装信息、插件文件整理、注册信息整理、插件加载测试等,而完整的插件加载流程为插件信息查询、生成插件ini配置文件、添加插件环境变量、文件链接和注册表以及注册信息等辅助手段、启动3dsMax软件等。

 


我对自己说,
跨过去,春天不远了。
永远不要失去发芽的心情。

——林清玄