summaryrefslogtreecommitdiff
path: root/cnn_v3
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-03-22 08:04:24 +0100
committerskal <pascal.massimino@gmail.com>2026-03-22 08:04:24 +0100
commit3db63790c5954c304dfe5822cdbd337e02b4fab5 (patch)
treefa6a633b414875045386b81f613608b4bc9217a2 /cnn_v3
parent0c7bd063285a052eb7cd48b8a5c0c8dd203c7409 (diff)
fix(cnn_v3): blender_export --view-layer flag + fallback to layer[0]
Fixes KeyError when blend file uses a non-default view layer name. Adds --view-layer NAME arg; pass '?' to list available layers. Defaults to index 0 with a clear error if the name is not found. handoff(Gemini): blender_export.py view layer selection now robust
Diffstat (limited to 'cnn_v3')
-rw-r--r--cnn_v3/docs/HOW_TO_CNN.md1
-rw-r--r--cnn_v3/training/blender_export.py27
2 files changed, 26 insertions, 2 deletions
diff --git a/cnn_v3/docs/HOW_TO_CNN.md b/cnn_v3/docs/HOW_TO_CNN.md
index 6214b20..c9c16a7 100644
--- a/cnn_v3/docs/HOW_TO_CNN.md
+++ b/cnn_v3/docs/HOW_TO_CNN.md
@@ -163,6 +163,7 @@ not to Blender. Each `#` in `--output` is replaced by a zero-padded frame digit.
| `--height N` | 360 | Render resolution |
| `--start-frame N` | scene start | First frame |
| `--end-frame N` | scene end | Last frame |
+| `--view-layer NAME` | first layer | View layer name; pass `?` to list available layers |
**Render pass → CNN channel mapping:**
diff --git a/cnn_v3/training/blender_export.py b/cnn_v3/training/blender_export.py
index 63dd0e3..5d07c26 100644
--- a/cnn_v3/training/blender_export.py
+++ b/cnn_v3/training/blender_export.py
@@ -6,6 +6,12 @@ then renders the current scene to a multi-layer EXR.
Usage (headless):
blender -b scene.blend -P blender_export.py -- --output renders/frame_###
+ # List available view layers in the blend file:
+ blender -b scene.blend -P blender_export.py -- --view-layer ?
+
+ # Use a specific view layer:
+ blender -b scene.blend -P blender_export.py -- --output renders/frame_### --view-layer "MyLayer"
+
Each '#' in the output path is replaced by Blender with the frame number (zero-padded).
The script writes one multi-layer EXR per frame containing all required passes.
@@ -57,6 +63,11 @@ def parse_args():
"--end-frame", type=int, default=None,
help="Last frame to render (default: scene end frame)"
)
+ parser.add_argument(
+ "--view-layer", default=None, metavar="NAME",
+ help="View layer name to use (default: first available). "
+ "Use --view-layer without a value (or pass '?') to list available layers."
+ )
return parser.parse_args(argv)
@@ -77,8 +88,20 @@ def configure_scene(args):
# Use Cycles for best multi-pass support
scene.render.engine = "CYCLES"
- # Enable required render passes on the active view layer
- vl = scene.view_layers["ViewLayer"]
+ # Enable required render passes on the selected view layer
+ available = list(scene.view_layers.keys())
+ if getattr(args, "view_layer", None) in (None, "?"):
+ if args.view_layer == "?":
+ print("Available view layers:", available)
+ sys.exit(0)
+ vl = scene.view_layers[0]
+ else:
+ try:
+ vl = scene.view_layers[args.view_layer]
+ except KeyError:
+ print(f"ERROR: view layer '{args.view_layer}' not found.")
+ print(f"Available: {available}")
+ sys.exit(1)
vl.use_pass_combined = True # beauty target
vl.use_pass_diffuse_color = True # albedo
vl.use_pass_normal = True # world normals