gpt 물어보니 별도로 깔지 말고
blender 내의 scripting 에서 바로 할 수 있다고 한다.
built in module로 bpy 가 있다고 뜬다.

카메라와 spotlight를 track to 로 cube에 연결하고,

spot light를 옮겨서 렌더해봄.
그런데 아쉬운건.. 렌더를 for문 돌려서 하는데 blender 자체가 먹통이 된다는 점..
| import bpy import random import os # ------------------------- # 설정 # ------------------------- NUM_IMAGES = 10 cube = bpy.data.objects["Cube"] light = bpy.data.objects["Spot"] scene = bpy.context.scene # 저장 폴더 (blend 파일 기준) output_dir = bpy.path.abspath("//render_output") os.makedirs(output_dir, exist_ok=True) # PNG 저장 scene.render.image_settings.file_format = 'PNG' # ------------------------- # 렌더링 루프 # ------------------------- for i in range(NUM_IMAGES): # Cube 랜덤 이동 # cube.location.x = random.uniform(-2.0, 2.0) # cube.location.y = random.uniform(-2.0, 2.0) # cube.location.z = random.uniform(0.0, 2.0) # Spot Light 랜덤 이동 light.location.x = random.uniform(-5.0, 5.0) light.location.y = random.uniform(-5.0, 5.0) light.location.z = random.uniform(3.0, 8.0) # 렌더 저장 경로 scene.render.filepath = os.path.join(output_dir, f"image_{i:03d}.png") print(f"Rendering {scene.render.filepath}") bpy.ops.render.render(write_still=True) print("Done.") |
결과물 짜잔~

해상도를 줄이고, 렌더러를 eevee로 변경.
| PYTHON INTERACTIVE CONSOLE 3.13.9 (main, Apr 25 2025, 12:39:20) [GCC 14.2.1 20250110 (Red Hat 14.2.1-7)] Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, gpu, blf, mathutils Convenience Imports: from mathutils import *; from math import * Convenience Variables: C = bpy.context, D = bpy.data >>> import random >>> import os >>> >>> # ------------------------- >>> # 설정 >>> # ------------------------- >>> NUM_IMAGES = 10 >>> >>> cube = bpy.data.objects["Cube"] >>> light = bpy.data.objects["Spot"] >>> >>> scene = bpy.context.scene >>> >>> scene.render.engine = 'BLENDER_EEVEE' >>> scene.render.resolution_x = 640 >>> scene.render.resolution_y = 480 >>> scene.render.resolution_percentage = 100 >>> >>> # 저장 폴더 (blend 파일 기준) >>> output_dir = bpy.path.abspath("//render_output") >>> os.makedirs(output_dir, exist_ok=True) >>> >>> # PNG 저장 >>> scene.render.image_settings.file_format = 'PNG' >>> >>> # ------------------------- >>> # 렌더링 루프 >>> # ------------------------- >>> for i in range(NUM_IMAGES): ... # Cube 랜덤 이동 ... # cube.location.x = random.uniform(-2.0, 2.0) ... # cube.location.y = random.uniform(-2.0, 2.0) ... # cube.location.z = random.uniform(0.0, 2.0) ... # Spot Light 랜덤 이동 ... light.location.x = random.uniform(-5.0, 5.0) ... light.location.y = random.uniform(-5.0, 5.0) ... light.location.z = random.uniform(3.0, 8.0) ... # 렌더 저장 경로 ... scene.render.filepath = os.path.join(output_dir, f"image_{i:03d}.png") ... print(f"Rendering {scene.render.filepath}") ... bpy.ops.render.render(write_still=True) ... Rendering /home/falinux/render_output/image_000.png {'FINISHED'} Rendering /home/falinux/render_output/image_001.png {'FINISHED'} Rendering /home/falinux/render_output/image_002.png {'FINISHED'} Rendering /home/falinux/render_output/image_003.png {'FINISHED'} Rendering /home/falinux/render_output/image_004.png {'FINISHED'} Rendering /home/falinux/render_output/image_005.png {'FINISHED'} Rendering /home/falinux/render_output/image_006.png {'FINISHED'} Rendering /home/falinux/render_output/image_007.png {'FINISHED'} Rendering /home/falinux/render_output/image_008.png {'FINISHED'} Rendering /home/falinux/render_output/image_009.png {'FINISHED'} >>> print("Done.") |
파일로 저장하고 다음과 같이 옵션주면 명령줄에서 블렌더 gui 뜨지 않고 수행된다.
| $ blender --background ./Untitled.blend --python render.py Blender 5.1.2 (hash ec6e62d40fa9 built 2026-05-19 02:18:37) Reloading external rigs... Reloading external metarigs... 00:01.973 blend | Read blend: "/home/falinux/Untitled.blend" Rendering /home/falinux/render_output/image_000.png 00:03.747 render | Saved: '/home/falinux/render_output/image_000.png' Rendering /home/falinux/render_output/image_001.png 00:05.350 render | Saved: '/home/falinux/render_output/image_001.png' Rendering /home/falinux/render_output/image_002.png 00:06.877 render | Saved: '/home/falinux/render_output/image_002.png' Rendering /home/falinux/render_output/image_003.png 00:08.413 render | Saved: '/home/falinux/render_output/image_003.png' Rendering /home/falinux/render_output/image_004.png 00:10.050 render | Saved: '/home/falinux/render_output/image_004.png' Rendering /home/falinux/render_output/image_005.png 00:11.633 render | Saved: '/home/falinux/render_output/image_005.png' Rendering /home/falinux/render_output/image_006.png 00:13.181 render | Saved: '/home/falinux/render_output/image_006.png' Rendering /home/falinux/render_output/image_007.png 00:14.699 render | Saved: '/home/falinux/render_output/image_007.png' Rendering /home/falinux/render_output/image_008.png 00:16.263 render | Saved: '/home/falinux/render_output/image_008.png' Rendering /home/falinux/render_output/image_009.png 00:17.888 render | Saved: '/home/falinux/render_output/image_009.png' Done. Blender quit |
귀찮으면 -b -P
| $ blender --help Blender 5.1.2 Usage: blender [args ...] [file] [args ...] Render Options: -b or --background Run in background (often used for UI-less rendering). The audio device is disabled in background-mode by default and can be re-enabled by passing in '-setaudio Default' afterwards. Python Options: -P or --python <filepath> Run the given Python script file. |
+
gpu 가속 - eevee는 안되고 cycles만 된다고 하는데 확인 필요
| $ cat ../fire_render.py import bpy import random import os # ------------------------- # 설정 # ------------------------- NUM_IMAGES = 10 cube = bpy.data.objects["Node_1"] light = bpy.data.objects["Spot"] scene = bpy.context.scene #scene.render.engine = 'BLENDER_EEVEE' scene.render.engine = 'CYCLES' scene.cycles.device = 'GPU' scene.render.resolution_x = 640 scene.render.resolution_y = 480 scene.render.resolution_percentage = 100 prefs = bpy.context.preferences.addons["cycles"].preferences prefs.compute_device_type = "CUDA" prefs.refresh_devices() for device in prefs.devices: device.use = True print(device.name, device.type) # 저장 폴더 (blend 파일 기준) output_dir = bpy.path.abspath("//render_output") os.makedirs(output_dir, exist_ok=True) # PNG 저장 scene.render.image_settings.file_format = 'PNG' # ------------------------- # 렌더링 루프 # ------------------------- for i in range(NUM_IMAGES): # Cube 랜덤 이동 cube.location.x = random.uniform(-2.0, 2.0) cube.location.y = random.uniform(-2.0, 2.0) cube.location.z = random.uniform(0.0, 2.0) # Spot Light 랜덤 이동 light.location.x = random.uniform(-5.0, 5.0) light.location.y = random.uniform(-5.0, 5.0) light.location.z = random.uniform(3.0, 8.0) # 렌더 저장 경로 scene.render.filepath = os.path.join(output_dir, f"image_{i:03d}.png") print(f"Rendering {scene.render.filepath}") bpy.ops.render.render(write_still=True) print("Done.") |
Intel(R) Core(TM) i7-10510U 뺘르다고 생각을 안했었는데..
| $ time blender -b firefigher.blend -P fire_render.py Blender 5.1.2 (hash ec6e62d40fa9 built 2026-05-19 02:18:37) Reloading external rigs... Reloading external metarigs... 00:03.094 blend | Read blend: "/home/minimonk/20260713 render/firefigher.blend" Rendering /home/minimonk/20260713 render/render_output/image_000.png 00:05.087 render | Saved: '/home/minimonk/20260713 render/render_output/image_000.png' Rendering /home/minimonk/20260713 render/render_output/image_001.png 00:06.989 render | Saved: '/home/minimonk/20260713 render/render_output/image_001.png' Rendering /home/minimonk/20260713 render/render_output/image_002.png 00:08.897 render | Saved: '/home/minimonk/20260713 render/render_output/image_002.png' Rendering /home/minimonk/20260713 render/render_output/image_003.png 00:10.778 render | Saved: '/home/minimonk/20260713 render/render_output/image_003.png' Rendering /home/minimonk/20260713 render/render_output/image_004.png 00:12.696 render | Saved: '/home/minimonk/20260713 render/render_output/image_004.png' Rendering /home/minimonk/20260713 render/render_output/image_005.png 00:14.746 render | Saved: '/home/minimonk/20260713 render/render_output/image_005.png' Rendering /home/minimonk/20260713 render/render_output/image_006.png 00:16.792 render | Saved: '/home/minimonk/20260713 render/render_output/image_006.png' Rendering /home/minimonk/20260713 render/render_output/image_007.png 00:18.709 render | Saved: '/home/minimonk/20260713 render/render_output/image_007.png' Rendering /home/minimonk/20260713 render/render_output/image_008.png 00:20.950 render | Saved: '/home/minimonk/20260713 render/render_output/image_008.png' Rendering /home/minimonk/20260713 render/render_output/image_009.png 00:22.887 render | Saved: '/home/minimonk/20260713 render/render_output/image_009.png' Done. Blender quit real 0m23.343s user 0m10.385s sys 0m5.169s |
엥... 데탑 + 그래픽 카드인데 왜 노트북 만도 못하지?
| $ time blender --background ./firefigher.blend --python fire_render.py --gpu-backend opengl Blender 5.1.2 (hash ec6e62d40fa9 built 2026-05-19 02:18:37) 00:01.277 blend | Read blend: "/home/minimonk/firefigher.blend" 00:01.360 cycles | WARNING HIPEW initialization failed: Error opening HIP dynamic library NVIDIA GeForce GTX 1080 Ti CUDA NVIDIA GeForce GTX 1080 Ti CUDA Intel Core i5-8500 CPU @ 3.00GHz CPU NVIDIA GeForce GTX 1080 Ti OPTIX NVIDIA GeForce GTX 1080 Ti OPTIX Rendering /home/minimonk/render_output/image_000.png 00:08.547 render | Saved: '/home/minimonk/render_output/image_000.png' Rendering /home/minimonk/render_output/image_001.png 00:13.898 render | Saved: '/home/minimonk/render_output/image_001.png' Rendering /home/minimonk/render_output/image_002.png 00:19.551 render | Saved: '/home/minimonk/render_output/image_002.png' Rendering /home/minimonk/render_output/image_003.png 00:26.421 render | Saved: '/home/minimonk/render_output/image_003.png' Rendering /home/minimonk/render_output/image_004.png 00:33.915 render | Saved: '/home/minimonk/render_output/image_004.png' Rendering /home/minimonk/render_output/image_005.png 00:39.808 render | Saved: '/home/minimonk/render_output/image_005.png' Rendering /home/minimonk/render_output/image_006.png 00:45.484 render | Saved: '/home/minimonk/render_output/image_006.png' Rendering /home/minimonk/render_output/image_007.png 00:50.785 render | Saved: '/home/minimonk/render_output/image_007.png' Rendering /home/minimonk/render_output/image_008.png 00:56.725 render | Saved: '/home/minimonk/render_output/image_008.png' Rendering /home/minimonk/render_output/image_009.png 01:03.617 render | Saved: '/home/minimonk/render_output/image_009.png' Done. Blender quit real 1m3.925s user 4m1.146s sys 0m21.034s |
i5-8500 에서 CPU 렌더 돌리는데 왜 이따구지?
| $ time blender --background ./firefigher.blend --python cpu_render.py Blender 5.1.2 (hash ec6e62d40fa9 built 2026-05-19 02:18:37) 00:01.285 blend | Read blend: "/home/minimonk/firefigher.blend" Rendering /home/minimonk/render_output/image_000.png 00:24.717 render | Saved: '/home/minimonk/render_output/image_000.png' Rendering /home/minimonk/render_output/image_001.png 01:05.764 render | Saved: '/home/minimonk/render_output/image_001.png' Rendering /home/minimonk/render_output/image_002.png 01:47.330 render | Saved: '/home/minimonk/render_output/image_002.png' Rendering /home/minimonk/render_output/image_003.png 02:28.293 render | Saved: '/home/minimonk/render_output/image_003.png' Rendering /home/minimonk/render_output/image_004.png 03:15.950 render | Saved: '/home/minimonk/render_output/image_004.png' Rendering /home/minimonk/render_output/image_005.png 03:57.923 render | Saved: '/home/minimonk/render_output/image_005.png' Rendering /home/minimonk/render_output/image_006.png 04:40.469 render | Saved: '/home/minimonk/render_output/image_006.png' Rendering /home/minimonk/render_output/image_007.png 05:22.630 render | Saved: '/home/minimonk/render_output/image_007.png' Rendering /home/minimonk/render_output/image_008.png 06:11.436 render | Saved: '/home/minimonk/render_output/image_008.png' Rendering /home/minimonk/render_output/image_009.png 06:56.409 render | Saved: '/home/minimonk/render_output/image_009.png' Done. Blender quit real 6m56.760s user 17m10.307s sys 0m6.312s |
'프로그램 사용 > Blender' 카테고리의 다른 글
| blender animation (keyframe) (0) | 2026.07.13 |
|---|---|
| blender constraint "track to " (0) | 2026.07.13 |
| bpy 설치 + 간단 테스트 (0) | 2026.07.12 |
| blender armature ik (각도 제한 등) (0) | 2026.07.10 |
| bpy - Blender as a Python module (0) | 2026.07.10 |
