The new Blender 2.8 is great. Unfortunately it broke my batch render script.
Fixing the script and the rendering setup were quite a challenge due to the major UI changes in 2.8, but eventually I figured it out. Even learned a few new tricks along the way. How did I manage to write the original script without the built-in scripting console? So helpful!
My Blender export pipeline looks like this:
- master.blend file with fixed camera & lighting setup
- extra .blend file for each asset
- link assets into master
- for each asset, render object & shadow into separate PNG
First draft of the new script for 2.8:
import bpy import os import subprocess # Requires Blender 2.8 # # /Applications/blender.app/Contents/MacOS/Blender -b -P render28.py # # Notes: # # Node setup: see master.blend -> Compositing # Render menu -> Film -> transparent # Shadow catcher plane -> Object menu -> Visibility -> Shadow catcher # Adding more objects: File -> Link... -> "Collection" from ext. file -> Move to Assets collection in master basepath = os.path.normpath(os.path.dirname(os.path.abspath(__file__))) master_blend = "blender28-batch-render-test-master.blend" src = os.path.join(basepath, master_blend) bpy.ops.wm.open_mainfile(filepath=src) bpy.context.scene.render.resolution_percentage = 50 bpy.context.scene.render.resolution_x = 1280 bpy.context.scene.render.resolution_y = 960 bpy.context.scene.cycles.samples = 20 assets_name = "Assets" # name of collection in master.blend assets_collection = None for collection in bpy.data.collections: if collection.name == assets_name: assets_collection = collection break if assets_collection is None: print( "Error: %s collection not found in master" % assets_name ) quit() # Save original filenames for output nodes output_nodes =  for node in bpy.context.scene.node_tree.nodes: if ( node.type == "OUTPUT_FILE" ): output_nodes.append( ( node, node.file_slots.path ) ) for target in assets_collection.objects: # Show only the current object for obj in assets_collection.objects: obj.hide_render = obj.name != target.name # Set output filename for node, path in output_nodes: node.file_slots.path = target.name + "_" + path bpy.ops.render.render(animation=False)
Master & test .blend files here: blender28-batch-render-test.zip
Additionally, I created a simple pipeline for rendering weapon silhouettes for the HUD. With a single click, it pulls in each weapon model, renders it from a side-view, then uses just the alpha to write a single-color transparent PNG.
And similar setup for pickup icons, with a subtle “glow” pass.