不知道国内还有多少公司像我们一样被pipeline绑架,不得不用落后半个年代的软件和技术来混口饭吃。说多了都是眼泪,哎。
这次分享的是Arnold alShaders的AOV脚本python版,可以一次性创建P, N, OCC, depth, Depth, objxyz, diffuse_color, direct_backlight, direct_diffuse, direct_diffuse_raw, direct_specular, direct_specular_2, emission, indirect_backlight, indirect_diffuse, indirect_diffuse_raw, indirect_specular, indirect_specular_2, refraction, single_scatter, sss, uv这些分层。对于一般合成来说,加上各种matte的ID就足够绝大多数镜头使用了。
因为是从pipeline的循环数组方法剥离出来写成的,语法比较笨拙,当然也更容易读懂,方便修改。
这些AOV里的深度层和物体轴向层,使用了samplerInfo采样信息节点作为shader。环境遮蔽层使用了aiAmbientOcclusion节点作为shader。其余均为内置AOV层,理论上不用再单独制定数据类型和驱动接口。
最终将所有AOV合并写入一个exr文件里。
测试环境为maya2016 sp6,MtoA 1.4.2.2,alShaders-win-1.0.0rc19-ai4.2.12.2。
理论上只要是基于Arnold 4的alShaders版本都可以支持。
代码如下:
import maya.cmds as cmd import mtoa.aovs as aovs aovs.AOVInterface().addAOV('P' ) aovs.AOVInterface().addAOV('N' ) aovs.AOVInterface().addAOV('OCC' ) occNode = cmd.createNode('aiAmbientOcclusion',n='aiOcc') cmd.setAttr(occNode+'.spread',0.8) cmd.connectAttr(occNode+'.outColor','aiAOV_OCC.defaultValue') aovs.AOVInterface().addAOV('depth' ) aovs.AOVInterface().addAOV('Depth' ) cmd.setAttr('aiAOV_Depth.type',4) samNode = cmd.createNode('samplerInfo',n='samplerInfo1') mDNode = cmd.createNode('multiplyDivide',n='multiplyDivide1') cmd.setAttr(mDNode+'.input2X',-1) sRNode = cmd.createNode('setRange',n='setRange1') cmd.setAttr(sRNode+'.maxX',1) cmd.setAttr(sRNode+'.oldMaxX',1300) aUNode = cmd.createNode('aiUtility',n='aiUtility1') cmd.setAttr(aUNode+'.shadeMode',2) cmd.connectAttr(samNode+'.pointCameraZ',mDNode+'.input1X') cmd.connectAttr(mDNode+'.output',sRNode+'.value') cmd.connectAttr(sRNode+'.outValue',aUNode+'.color') cmd.connectAttr(aUNode+'.outColor','aiAOV_Depth.defaultValue') aovs.AOVInterface().addAOV('objxyz' ) cmd.setAttr('aiAOV_objxyz.type',8) samNode = cmd.createNode('samplerInfo') aUNode = cmd.createNode('aiUtility',n='objxyz') cmd.setAttr(aUNode+'.shadeMode',2) cmd.connectAttr(samNode+'.pointObjX',aUNode+'.colorR') cmd.connectAttr(samNode+'.pointObjY',aUNode+'.colorG') cmd.connectAttr(samNode+'.pointObjZ',aUNode+'.colorB') cmd.connectAttr(aUNode+'.outColor','aiAOV_objxyz.defaultValue') aovs.AOVInterface().addAOV('diffuse_color' ) aovs.AOVInterface().addAOV('direct_backlight' ) aovs.AOVInterface().addAOV('direct_diffuse' ) aovs.AOVInterface().addAOV('direct_diffuse_raw' ) aovs.AOVInterface().addAOV('direct_specular' ) aovs.AOVInterface().addAOV('direct_specular_2' ) aovs.AOVInterface().addAOV('emission' ) aovs.AOVInterface().addAOV('indirect_backlight' ) aovs.AOVInterface().addAOV('indirect_diffuse' ) aovs.AOVInterface().addAOV('indirect_diffuse_raw' ) aovs.AOVInterface().addAOV('indirect_specular' ) aovs.AOVInterface().addAOV('indirect_specular_2' ) aovs.AOVInterface().addAOV('refraction' ) aovs.AOVInterface().addAOV('single_scatter' ) aovs.AOVInterface().addAOV('sss' ) aovs.AOVInterface().addAOV('uv' ) cmd.setAttr('defaultArnoldDriver.mergeAOVs',True)