Для того чтобы можно было выполнять определенные действия на разных этапах рендера, разработчики предусмотрели в Blender Python API набор хендлеров – специальных функций для обработки событий.
Все доступные хендлеры можно посмотреть, выполнив следующую команду:
1 2 3 |
print(bpy.app.handlers) # bpy.app.handlers(frame_change_pre=[], frame_change_post=[], render_pre=[], render_post=[], ... ) |
Хендлеры, которые относятся непосредственно к процессу рендера, следующие:
1 |
# on_render_init, on_render_pre, on_render_post, on_render_write, on_render_complete, on_render_cancel |
Каждый из этих хендлеров вызывается в определенный момент, например, хендлер “on_render_init” – при старте рендера.
Для того чтобы во время вызова этого хендлера выполнялись нужные нам действия, определим функцию:
1 2 |
def on_render_init(*args): print('on redner init') |
В нашем примере она просто печатает текст в консоль, однако вы можете заполнить ее любыми нужными действиями.
Привяжем нашу функцию к вызову хендлера:
1 |
bpy.app.handlers.render_init.append(on_render_init) |
Теперь каждый раз в начала рендера в консоль будет выводиться текст.
Определим аналогичные функции для каждого события рендера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def on_render_pre(*args): print('on redner pre') def on_render_post(*args): print('on redner post') def on_render_write(*args): print('on render write') def on_render_complete(*args): print('on redner complete') def on_render_cancel(*args): print('on redner cancel') |
И свяжем их с соответствующими хендлерами:
1 2 3 4 5 6 |
bpy.app.handlers.render_init.append(on_render_init) bpy.app.handlers.render_pre.append(on_render_pre) bpy.app.handlers.render_post.append(on_render_post) bpy.app.handlers.render_write.append(on_render_write) bpy.app.handlers.render_complete.append(on_render_complete) bpy.app.handlers.render_cancel.append(on_render_cancel) |
Теперь при запуске рендера мы получим следующий вывод в системную консоль, для анимации из двух кадров:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
on redner init on redner pre Saved: 'C:\tmp\0001.png' Time: 00:00.32on render stats (Saving: 00:00.02) on redner post on render write on redner pre Saved: 'C:\tmp\0002.png' Time: 00:00.13on render stats (Saving: 00:00.02) on redner post on render write on redner complete |
Как мы видим, обработка событий рендера выполняется в следующем порядке:
- render_init – перед началом рендера
- render_pre – перед началом рендера каждого кадра
- render_post – после завершения рендера каждого кадра
- render_write – после сохранения каждого кадра
- render_complete – после завершения рендера всех кадров
Событие render_cancel выполняется в момент отмены рендера, например, если пользователь нажал кнопку ESC в процессе рендера.