资源 · 2021年8月10日 0

【maya脚本】Arnold alShaders自动创建AOV pass脚本python版分享

不知道国内还有多少公司像我们一样被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)