Before starting rendering, you must ensure that the current renderer is Arnold and ensure that Arnold is loaded correctly and configured correctly.
Below, I have provided the code for the function that serves the loading and configuration of Arnold.
In addition, it is advisable to check and disable IPR
in the current Render View
window.
And also check and cancel batchRender
.
Arnold copies many of the parameter values for his attributes from the parameter values of the defaultRenderGlobals
node.
This behavior is set by default, using the defaultArnoldRenderOptions.renderGlobals
attribute.
Therefore, for many resulting parameters, it does not matter where they were set: in the defaultRenderGlobals
node or in the defaultArnoldRenderOptions
/ defaultArnoldDriver
nodes.
It is important to distinguish that Arnold has two different nodes with similar functions:
defaultArnoldDriver
and defaultArnoldDisplayDriver
!!!
Next: Camera resolution. You can change the parameters globally in the defaultResolution
node.
And then, by default, rendering will occur with the parameters specified in the defaultResolution
node.
Alternatively, you can specify render-only resolution values using the -height
and -width
flags in the arnoldRender
command
Passing an absolute path to defaultRenderGlobals.imageFilePrefix
is a VERY, VERY BAD IDEA!!!
Instead, change the path to the current project’s images
folder (set to workspace
).
You can manipulate workspace parameters using the workspace
command of the same name.
If necessary, after rendering is complete, revert the previous value for the current project’s images
folder path.
You may want to have some parameter values appended to the base filename.
For example: camera name, resolution, frame number, etc.
You can set/change Frame/Animation extension parameters using the attributes of the defaultRenderGlobals
node:
To do this, you must first set the parameters for the animation
and outFormatControl
attributes:
cmds.setAttr('defaultRenderGlobals.animation', 1)
cmds.setAttr('defaultRenderGlobals.outFormatControl', 0)
After this, you can set how to build the extension.
For example, for name_####.ext
:
cmds.setAttr('defaultRenderGlobals.putFrameBeforeExt', 1)
cmds.setAttr('defaultRenderGlobals.periodInExt', 2)
cmds.setAttr('defaultRenderGlobals.extensionPadding', 4)
You can see more details in the file:
C:\Program Files\Autodesk\Maya2024\scripts\others\setMayaSoftwareFrameExt.mel
You can still set/change parameters for Animation Range using the attributes of the defaultRenderGlobals
node:
cmds.setAttr('defaultRenderGlobals.animationRange', 0)
cmds.setAttr('defaultRenderGlobals.startFrame', start_frame)
cmds.setAttr('defaultRenderGlobals.endFrame', end_frame)
cmds.setAttr('defaultRenderGlobals.byFrameStep', step_frame)
Well, the actual rendering needs to be done using the arnoldRender
command.
For example:
cmds.arnoldRender(batch = True, camera = camera_name, height = 1920, width = 1080)
Other arnoldRender
flags:
-ofn / -origFileName
- String
-p / -port
- UnsignedInt
-seq / -frameSequence
- String
-srv / -saveToRenderView
- String
Small demo:
import os
import maya.cmds as cmds
# Def for load and configure Arnold Renderer:
def load_and_configure_arnold_render():
# Check that IPR and Batch is not running. Otherwise - cancel:
try:
cmds.arnoldRenderView(opt = ('Run IPR', 'False'))
except:
pass
try:
cmds.batchRender()
except:
pass
if 'mtoa' in cmds.moduleInfo(listModules = True):
if not cmds.pluginInfo('mtoa', query = True, loaded = True):
print(('{0}{1}{2}{0}'
).format('\n','\t', ' Loaded Arnold MtoA Plugin ...'))
try:
cmds.loadPlugin('mtoa', quiet = True)
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' Loaded Arnold MtoA Plugin - successful.'))
from mtoa.core import createOptions
if not cmds.objExists('defaultArnoldRenderOptions'):
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' Create Arnold Render Options ...'))
createOptions()
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' Create Arnold Render Options -' +
' successful.'))
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' Configure Arnold Render Options ...'))
cmds.setAttr(
'defaultArnoldRenderOptions.render_device_fallback', 1)
cmds.setAttr(
'defaultArnoldRenderOptions.renderDevice', 0)
cmds.setAttr(
'defaultArnoldRenderOptions.abortOnError', 0)
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' Arnold Render Options configure -' +
' successful.'))
except Exception:
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' !!! Error loading Arnold MtoA Plugin !!!'))
traceback_print_exc()
return 0
else:
return 1
else:
try:
print(('{}{}'
).format('\t',
' Create and configure Arnold Render Options ' +
'...'))
from mtoa.core import createOptions
createOptions()
cmds.setAttr(
'defaultArnoldRenderOptions.render_device_fallback', 1)
cmds.setAttr(
'defaultArnoldRenderOptions.renderDevice', 0)
cmds.setAttr(
'defaultArnoldRenderOptions.abortOnError', 0)
cmds.arnoldFlushCache(flushall = True)
print(('{1}{2}{0}'
).format('\n', '\t',
' Arnold Render Options create and configure' +
' - successful'))
except Exception:
print(('{0}{1}{2}{0}'
).format('\n', '\t',
' !!! Error Create and configure Arnold' +
' Render Options !!!'))
traceback_print_exc()
return 0
else:
return 1
else:
print(('{0}{0}{1}{2}{0}{0}'
).format('\n', '\t',
' !!! Arnold MtoA Plugin Not registred in this' +
' MAYA_PLUG_IN_PATH !!!'))
return 0
# Def for configure minimal Renderer options:
def prerender_settings(output_dir, image_base_name, camera_name, start_frame, end_frame, step_frame = 1, image_format = 'exr'):
# Create output dir if not exists.
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# Create output file name with camera name and resolution parametrs.
output_file_base_name = ('{}__cam_{}_{}x{}_frame').format(image_base_name, camera_name, im_h, im_w)
if load_and_configure_arnold_render():
# Set "defaultArnoldRenderOptions" "renderGlobals" attribut from "defaultRenderGlobals" node attributes.
cmds.setAttr('defaultArnoldRenderOptions.renderGlobals', 'defaultRenderGlobals', type = 'string')
# Set "defaultArnoldDriver" attribut for output render file format ("exr").
cmds.setAttr('defaultArnoldDriver.aiTranslator', image_format, type = 'string')
cmds.setAttr('defaultArnoldDriver.outputMode', 2)
cmds.setAttr('defaultArnoldDriver.exrCompression', 0)
cmds.setAttr('defaultArnoldDriver.colorManagement', 2)
# Set defaultRenderGlobals attributes for prefix (replace default render path)
cmds.setAttr('defaultRenderGlobals.imageFilePrefix', output_file_base_name, type = 'string')
cmds.setAttr('defaultRenderGlobals.useFrameExt', 1)
cmds.setAttr('defaultRenderGlobals.useMayaFileName', 1)
# Set defaultRenderGlobals attributes for naming with frame ext.
cmds.setAttr('defaultRenderGlobals.animation', 1)
cmds.setAttr('defaultRenderGlobals.outFormatControl', 0)
cmds.setAttr('defaultRenderGlobals.putFrameBeforeExt', 1)
cmds.setAttr('defaultRenderGlobals.periodInExt', 2)
cmds.setAttr('defaultRenderGlobals.extensionPadding', 4)
# Set defaultRenderGlobals attributes for animation range
cmds.setAttr('defaultRenderGlobals.animationRange', 0)
cmds.setAttr('defaultRenderGlobals.startFrame', start_frame)
cmds.setAttr('defaultRenderGlobals.endFrame', end_frame)
cmds.setAttr('defaultRenderGlobals.byFrameStep', step_frame)
return 1
else:
cmds.error('\n', '\t',
' !!! Error Create and configure Arnold' +
' Render Options !!!')
return 0
# Set Custom input parametrs:
image_format = 'exr'
camera_name = 'persp'
im_h = 1080
im_w = 1920
start_frame = 0
end_frame = 5
step_frame = 1
output_dir = os.path.normpath('e:/Temp')
image_base_name = 'My_creative'
# Get current "images" folder:
workspace_file_rule_images = cmds.workspace(fileRuleEntry = 'images')
# Get extend current "images" folder:
# cmds.workspace(expandName = workspace_file_rule_images)
# Set output dir for current "images" folder:
cmds.workspace(fileRule=[workspace_file_rule_images, output_dir])
# We will do all preparatory work:
alloved = prerender_settings(output_dir, image_base_name, camera_name, start_frame, end_frame, step_frame, image_format)
# Rendering current frame. Only camera flag. Resolution from value in defaultResolution node
if alloved: cmds.arnoldRender(camera = camera_name)
# OR
# Rendering current frame. Set Custom Resolution flags
if alloved: cmds.arnoldRender(camera = camera_name, height = im_h, width = im_w)
# OR
# Rendering sequence with custom resolution, from range values in defaultRenderGlobals node
if alloved: cmds.arnoldRender(batch = True, camera = camera_name, height = im_h, width = im_w)
# Assign the previos value for "images" folder (relative):
cmds.workspace(fileRule = ['images', workspace_file_rule_images])
I hope this post will make the rendering process more transparent and controllable for you.
Good luck and harmony!
Print help info for nodes attributes:
print(sorted(cmds.attributeInfo("defaultArnoldRenderOptions", all = True)))
print(sorted(cmds.attributeInfo("defaultArnoldDriver", all = True)))
print(sorted(cmds.attributeInfo("defaultArnoldFilter", all = True)))
print(sorted(cmds.attributeInfo("defaultRenderGlobals", all = True)))
print(sorted(cmds.attributeInfo("defaultResolution", all = True)))
command (Python) workspace
PS:
If you do not want the image to be written to the tmp
subfolder when rendering one current frame, then use arnoldRender
with the batch = True
flag, while setting start_frame = end_frame = current frame.
PS_02:
Regarding cmds.render(cam)
:
I think the command works and saves the images rendered using MayaSoftware renderer
into a tmp
subfolder
PS_03:
mel.eval('renderWindowRenderCamera render renderView "front";')
By default, orthogonal cameras are not Renderable.
To fix this:
cmds.setAttr('frontShape.renderable', 1)
mel.eval('renderWindowEditor -edit -writeImage "C:\\qwe.exr" renderView;')
You can not do it this way. MEL syntax requires either a backslash or a forward triple slash:
mel.eval('renderWindowEditor -edit -writeImage "C:\\\qwe.exr" renderView;')
or
mel.eval('renderWindowEditor -edit -writeImage "C:/qwe.exr" renderView;')
Or, just use the python command:
cmds.renderWindowEditor('renderView', edit = True, writeImage = r'C:\qwe.exr')
But! In different versions of Maya, the result is unpredictable and incorrect with almost all formats!
Using the -colorManage
and -cmEnabled
flags does not correct the situation…
At the same time, saving manually, through the menu, or using Arnold commands works correctly with all formats.