Automated summary
Configures Blender render settings (Cycles, EEVEE), output formats and compositing nodes, then runs renders through the Python API or the CLI.
Strengths
- Concrete Python snippets for tuning Cycles (adaptive sampling, OptiX denoising, bounce limits) and EEVEE (bloom, GTAO, screen-space reflections)
- Covers output configuration: resolution, pixel aspect, file format and color depth
- Covers both scripted bpy and command-line execution, which supports batch render workflows
- Each step ends with a success criterion and an error-triage hint
Limitations
- The supplied content is cut off mid-code-block (PNG settings), so the compositing and multi-format sections cannot be fully verified
- The text is written in an ultra-terse 'caveman' register that makes some step sequences and parameter intents harder to follow
- Several API calls are Blender-version-specific (BLENDER_EEVEE, use_bloom) and may break with EEVEE Next in 4.2+
Use it when you need to script or automate Blender renders, run batch image jobs, or standardize output formats and post-processing.
Avoid it when the task is modeling, animation or scene construction, or when the project does not use Blender.
Security analysis
CautionThis is a legitimate Blender rendering guide that uses powerful local tools—Bash, Blender CLI, Python bpy, file writes, and directory creation—for normal rendering workflows. It does not exfiltrate data, disable safety mechanisms, use obfuscated payloads, or perform destructive system actions, but it does carry standard tool-execution and file-modification risk.
- •Uses Bash and Blender Python/CLI execution to render and write output files; legitimate but can create or overwrite files in user-specified output directories.
- •The output path helper accepts a caller-provided base_dir and creates directories/writes renders without additional path validation, so misuse could write outside the intended project directory.
- •The compositing setup calls nodes.clear(), which removes existing compositor nodes in the scene; this is a data-modification risk rather than a security exploit.
- •Declares Bash and includes CLI commands that invoke Blender and write render output to user-specified paths; this is legitimate but could overwrite existing files if paths are misconfigured.
- •Python snippets create directories and write image files; no deletion, network exfiltration, obfuscation, or safety-disabling behavior is present.
Examples
Write a bpy script that opens scene.blend, switches to Cycles on GPU with 128 adaptive samples and OptiX denoising, renders 1920x1080, and writes PNGs to /renders/output_####.pngConfigure EEVEE for a stylized shot: 64 TAA render samples, bloom on, GTAO on with 0.2 distance, screen-space reflections, then render the frame from the command line.Set up a compositing node graph so a single Cycles render outputs both a 16-bit OpenEXR and a JPEG, then save both to the output folder.name: render-blender-output locale: caveman-ultra source_locale: en source_commit: 82c77053 translator: "Julius Brussee homage — caveman" translation_date: "2026-04-26" description: > Configure render settings, compositing nodes, output formats, execute renders via Cycles or EEVEE w/ Python API or CLI. Use → automate batch render, config quality/perf trade-offs, set up compositing pipelines, generate multi output formats from single render, produce final output for publication. license: MIT allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: blender complexity: intermediate language: Python tags: blender, bpy, rendering, cycles, eevee, compositing, output
Render Blender Output
Configure render engines (Cycles, EEVEE), set output params, build compositing node graphs, execute via Python API or CLI. Render settings opt, file format select, post-processing.
Use When
- Automate batch render
- Config render quality + perf trade-offs
- Set up compositing pipelines → post-process
- Generate multi output formats from single render
- Optimize render settings → diff hardware
- Create CLI rendering workflows
- Produce final output → publication/presentation
In
| Input | Type | Description | Example |
|---|---|---|---|
| Scene file | .blend file | Blender scene to render | scene.blend |
| Render engine | String | Cycles, EEVEE, or Workbench | CYCLES |
| Quality settings | Parameters | Samples, resolution, denoising | 128 samples, 1920x1080, OptiX denoiser |
| Output format | String | PNG, EXR, JPEG, TIFF | OPEN_EXR, 16-bit, ZIP compression |
| Compositing setup | Node graph | Post-processing effects | Color grading, glare, vignette |
| Output path | File path | Render destination | /renders/output_####.png |
Do
1. Configure Render Engine
Set engine + basic params:
import bpy
def setup_cycles_engine():
"""Configure Cycles render engine."""
scene = bpy.context.scene
scene.render.engine = 'CYCLES'
# Device settings
scene.cycles.device = 'GPU' # or 'CPU'
# Sampling
scene.cycles.samples = 128 # Viewport: fewer samples
scene.cycles.use_adaptive_sampling = True
scene.cycles.adaptive_threshold = 0.01
# Denoising
scene.cycles.use_denoising = True
scene.cycles.denoiser = 'OPTIX' # or 'OPENIMAGEDENOISE', 'NLM'
# Light paths
scene.cycles.max_bounces = 12
scene.cycles.diffuse_bounces = 4
scene.cycles.glossy_bounces = 4
scene.cycles.transmission_bounces = 12
scene.cycles.volume_bounces = 0
def setup_eevee_engine():
"""Configure EEVEE render engine."""
scene = bpy.context.scene
scene.render.engine = 'BLENDER_EEVEE'
# Sampling
scene.eevee.taa_render_samples = 64
# Effects
scene.eevee.use_bloom = True
scene.eevee.bloom_threshold = 0.8
scene.eevee.bloom_intensity = 0.1
scene.eevee.use_gtao = True # Ambient occlusion
scene.eevee.gtao_distance = 0.2
scene.eevee.use_ssr = True # Screen space reflections
scene.eevee.ssr_quality = 0.5
# Shadows
scene.eevee.shadow_cube_size = '1024'
scene.eevee.shadow_cascade_size = '1024'
→ Engine configured w/ appropriate quality settings If err: check engine name spelling, verify GPU available for GPU rendering
2. Resolution + Output Format
Configure output dimensions + format:
def configure_output(width=1920, height=1080, file_format='PNG', color_depth='16'):
"""Set output resolution and format."""
scene = bpy.context.scene
# Resolution
scene.render.resolution_x = width
scene.render.resolution_y = height
scene.render.resolution_percentage = 100
# Aspect ratio
scene.render.pixel_aspect_x = 1.0
scene.render.pixel_aspect_y = 1.0
# File format
scene.render.image_settings.file_format = file_format
if file_format == 'PNG':
scene.render.image_settings.color_mode = 'RGBA'
scene.render.image_settings.color_depth = color_depth # '8' or '16'
scene.render.image_settings.compression = 15 # 0-100
elif file_format == 'OPEN_EXR':
scene.render.image_settings.color_mode = 'RGBA'
scene.render.image_settings.color_depth = '32' # or '16'
scene.render.image_settings.exr_codec = 'ZIP' # or 'DWAA', 'PIZ'
elif file_format == 'JPEG':
scene.render.image_settings.color_mode = 'RGB'
scene.render.image_settings.quality = 90 # 0-100
elif file_format == 'TIFF':
scene.render.image_settings.color_mode = 'RGBA'
scene.render.image_settings.color_depth = color_depth
scene.render.image_settings.tiff_codec = 'DEFLATE'
# Frame range (for animations)
scene.frame_start = 1
scene.frame_end = 250
scene.frame_step = 1
→ Output format + resolution configured correctly If err: check format names valid, verify color depth compatible
3. Configure Compositing
Set up compositing node graph:
def setup_compositing():
"""Create compositing node setup."""
scene = bpy.context.scene
scene.use_nodes = True
tree = scene.node_tree
nodes = tree.nodes
links = tree.links
# Clear default nodes
nodes.clear()
# Render Layers input
render_layers = nodes.new(type='CompositorNodeRLayers')
render_layers.location = (-400, 300)
# Denoise (if not using Cycles denoiser)
# denoise = nodes.new(type='CompositorNodeDenoise')
# denoise.location = (-200, 300)
# Color correction
color_correct = nodes.new(type='CompositorNodeColorCorrection')
color_correct.location = (0, 300)
color_correct.master_saturation = 1.1
color_correct.master_gain = 1.05
# Glare effect
glare = nodes.new(type='CompositorNodeGlare')
glare.location = (200, 200)
glare.glare_type = 'FOG_GLOW'
glare.threshold = 0.9
glare.size = 8
# Vignette
lens_distortion = nodes.new(type='CompositorNodeLensdist')
lens_distortion.location = (200, 0)
lens_distortion.inputs['Dispersion'].default_value = 0.0
lens_distortion.inputs['Distortion'].default_value = -0.02
# Mix nodes
mix1 = nodes.new(type='CompositorNodeMixRGB')
mix1.location = (400, 250)
mix1.blend_type = 'ADD'
mix1.inputs['Fac'].default_value = 0.3
# Composite output
composite = nodes.new(type='CompositorNodeComposite')
composite.location = (600, 300)
# Viewer output (for preview)
viewer = nodes.new(type='CompositorNodeViewer')
viewer.location = (600, 100)
# Link nodes
links.new(render_layers.outputs['Image'], color_correct.inputs['Image'])
links.new(color_correct.outputs['Image'], mix1.inputs[1])
links.new(color_correct.outputs['Image'], glare.inputs['Image'])
links.new(glare.outputs['Image'], mix1.inputs[2])
links.new(mix1.outputs['Image'], composite.inputs['Image'])
links.new(mix1.outputs['Image'], viewer.inputs['Image'])
→ Compositing nodes configured w/ post-processing effects If err: check node type names, verify inputs exist, ensure link connections valid
4. Output File Paths
Configure output naming w/ frame numbers:
import os
from pathlib import Path
def set_output_path(base_dir, project_name, use_frame_number=True):
"""Configure output file path."""
scene = bpy.context.scene
# Create output directory
output_dir = Path(base_dir) / project_name / "renders"
output_dir.mkdir(parents=True, exist_ok=True)
# Set filepath
if use_frame_number:
# #### is replaced with frame number (0001, 0002, etc.)
filename = f"{project_name}_####"
else:
filename = project_name
scene.render.filepath = str(output_dir / filename)
# Optional: Set file extension explicitly
# Extension added automatically based on file_format
# But can override: scene.render.file_extension = '.png'
→ Output dir created, filepath configured w/ frame numbering If err: check dir perms, verify path syntax for OS
5. View Layers + Passes
Set up render passes for compositing:
def configure_view_layers():
"""Enable render passes."""
scene = bpy.context.scene
view_layer = scene.view_layers['ViewLayer']
# Enable passes
view_layer.use_pass_combined = True
view_layer.use_pass_z = True # Depth
view_layer.use_pass_mist = False
view_layer.use_pass_normal = True
view_layer.use_pass_vector = True # Motion vectors
view_layer.use_pass_ambient_occlusion = True
# Cycles-specific passes
cycles = view_layer.cycles
cycles.use_pass_diffuse_direct = True
cycles.use_pass_diffuse_indirect = True
cycles.use_pass_glossy_direct = True
cycles.use_pass_glossy_indirect = True
cycles.use_pass_emission = True
cycles.use_pass_environment = True
# Cryptomatte passes (for post-production)
cycles.use_pass_crypto_object = True
cycles.use_pass_crypto_material = True
cycles.use_pass_crypto_asset = True
→ Render passes enabled for advanced compositing If err: check passes available for engine, verify view layer name
6. Execute Render
Render via Python API or CLI:
def render_still():
"""Render current frame."""
bpy.ops.render.render(write_still=True)
def render_animation():
"""Render animation frame range."""
bpy.ops.render.render(animation=True)
def render_frame(frame_number):
"""Render specific frame."""
scene = bpy.context.scene
scene.frame_set(frame_number)
bpy.ops.render.render(write_still=True)
# Command-line rendering (run from terminal)
# Single frame:
# blender scene.blend --background --render-frame 1
# Animation:
# blender scene.blend --background --render-anim
# Specific frame range:
# blender scene.blend --background --frame-start 10 --frame-end 20 --render-anim
# Override output path:
# blender scene.blend --background --render-output /tmp/render_#### --render-anim
# Use Python script:
# blender scene.blend --background --python render_script.py
→ Render executes, output files written to specified location If err: check scene setup, verify camera exists, ensure output dir writable
7. Batch Render Multi Cameras
Render from multi camera angles:
def render_all_cameras(output_dir):
"""Render scene from all cameras."""
scene = bpy.context.scene
original_camera = scene.camera
cameras = [obj for obj in bpy.data.objects if obj.type == 'CAMERA']
for camera in cameras:
# Set active camera
scene.camera = camera
# Update output path
camera_name = camera.name.replace(' ', '_')
scene.render.filepath = os.path.join(output_dir, f"{camera_name}_####")
# Render
bpy.ops.render.render(write_still=True)
print(f"Rendered from camera: {camera.name}")
# Restore original camera
scene.camera = original_camera
→ Renders generated for each camera in scene If err: check cameras exist, verify each positioned correctly
8. Optimize Perf
Configure perf settings:
def optimize_performance():
"""Optimize render settings for speed."""
scene = bpy.context.scene
if scene.render.engine == 'CYCLES':
# Tile size (GPU: larger tiles, CPU: smaller tiles)
if scene.cycles.device == 'GPU':
scene.render.tile_x = 256
scene.render.tile_y = 256
else:
scene.render.tile_x = 32
scene.render.tile_y = 32
# Performance settings
scene.cycles.use_adaptive_sampling = True
scene.render.use_persistent_data = True # Keep scene in memory
# Reduce light path complexity for preview
scene.cycles.max_bounces = 4
scene.cycles.diffuse_bounces = 2
scene.cycles.glossy_bounces = 2
# Progressive refine (for viewport)
scene.cycles.use_progressive_refine = True
elif scene.render.engine == 'BLENDER_EEVEE':
# Simplify settings for preview
scene.render.use_simplify = True
scene.render.simplify_subdivision = 2
# Reduce sampling
scene.eevee.taa_render_samples = 32
→ Render settings optimized for target hardware If err: test w/ lower quality first, monitor mem usage
Check
- [ ] Engine configured (Cycles/EEVEE)
- [ ] Resolution + aspect ratio match req
- [ ] Output format appropriate
- [ ] Color depth + compression verified
- [ ] Compositing nodes connected properly
- [ ] Output dir exists + writable
- [ ] Filename has frame numbering if needed
- [ ] Passes enabled as required
- [ ] Camera positioned correctly
- [ ] Test render completes w/o errors
- [ ] Output files have correct format + quality
Traps
- Missing camera: Scene must have active camera set for rendering
- Output path not set: Always specify
scene.render.filepathbefore render - Insufficient samples: Low sample counts → noise in Cycles renders
- Wrong color space: Check color mgmt for correct display
- File format incompat: Not all formats support all color depths
- Mem overflow: Large resolutions or complex scenes exceed RAM
- GPU OOM: Reduce tile size or switch to CPU for large scenes
- Background mode output: Must use --render-output flag or set filepath
- Frame number formatting: Use #### for auto frame padding
- Compositing disabled: Enable
scene.use_nodesto use compositing
→
- create-3d-scene: Scene setup required before render
- script-blender-automation: Batch render automation patterns
- render-publication-graphic: Publication output requirements
From the file to a first result
The download contains exactly the content displayed on this page. This copy may differ from the latest version in the source repository.
View the source and supporting filesThis download contains SKILL.md only. Any scripts, references, templates and dependencies are not included. Get the required files from the source, preserving their directory structure, before continuing.
1. Download the file
Download SKILL.mdFrom the root of a test project, save the file as .skill-downloads/render-blender-output-mryiqgov/SKILL.md, or use the command below. This folder is for inspecting the skill before installation.
Command for macOS/Linux or WSL: requires a POSIX shell and curl. On Windows without WSL, use the download button and create the folder manually.
mkdir -p '.skill-downloads/render-blender-output-mryiqgov' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/render-blender-output-mryiqgov/download' --output '.skill-downloads/render-blender-output-mryiqgov/SKILL.md.part' && mv '.skill-downloads/render-blender-output-mryiqgov/SKILL.md.part' '.skill-downloads/render-blender-output-mryiqgov/SKILL.md'2. Check prerequisites
Read SKILL.md before using it. If it references scripts or external services, inspect them and prepare the required access in your test environment.
Tools declared by the author (check availability in your agent): Read Write Edit Bash Grep Glob
No recognized prerequisites section in this file. This does not mean it is self-contained: libraries, tools and access requirements may be mentioned elsewhere in the content or source repository.
The platforms on this page are catalog indications. The paths below follow tool documentation; they do not prove this skill has been run in those tools. No minimum tool version is confirmed for this listing.
3. Load the skill
After inspection, copy the complete folder into your project using one of the commands below, then open a new tool session. The command stops if a folder with the same name already exists: compare the files before replacing it.
Claude Code
test -f '.skill-downloads/render-blender-output-mryiqgov/SKILL.md' && test -s '.skill-downloads/render-blender-output-mryiqgov/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/render-blender-output' && cp -R '.skill-downloads/render-blender-output-mryiqgov' '.claude/skills/render-blender-output'OpenSkills
OpenSkills must already be installed. The local install/read procedure is checked with OpenSkills 1.5.0, which requires Node.js ≥ 20.6.0. Catalog slugs are not resolved automatically.
Official OpenSkills installationopenskills install './.skill-downloads/render-blender-output-mryiqgov'openskills read 'render-blender-output-mryiqgov'Reading should display the installed file content and its base directory. It does not run the skill or install its dependencies.
For an agent that reads AGENTS.md, then sync the index. This command changes AGENTS.md: review the diff before using it.
openskills syncManual method or another tool: attach SKILL.md to a conversation, or open it in an agent that can read files. Include any required supporting resources. No universal folder is recognized by every tool.
4. Try a first task
Use a short, synthetic input: an API endpoint, a small document or an interface brief. In a new conversation, attach the file or give the agent its path, then adapt this request:
Read .skill-downloads/render-blender-output-mryiqgov/SKILL.md and apply its instructions to this example: [describe a test input]. Identify any missing files, dependencies or access. Produce the result requested by the skill without inventing data or running unreviewed scripts.Expected result: output matching the skill instructions, or a precise list of missing prerequisites. A read confirmation alone does not validate a first use. If an external resource is unavailable, that path remains untested.
React Hook Form Best Practices
Development
Master React Hook Form: avoid anti-patterns, manage subscriptions, and handle reset, dirty state, and controlled inputs correctly.
Emotion to Mantine Migration
Development
Migrate Emotion styled-components to Mantine components with style props and CSS modules. Use when converting .styled.tsx files or removing @emotion imports.
Scope Creep Detector
Development
Analyzes git diffs against a stated intent to detect scope creep, unrelated files, broad PRs, and oversized changes, then suggests keep, split, or justify actions.