likes
comments
collection
share

【翻译】Blender 如何直接反向渲染并输出帧

作者站长头像
站长
· 阅读数 35

英文原问题链接:Render frames in reverse

提问

有没有反向渲染的方法?

不,我不想倒着播放。我知道如何将(已经顺序)输出的帧进行反向,这并不难。

但是我想直接 向后渲染,因为我想在两台机器上以明显不同的速度进行渲染:一台从结尾开始,另一台从开头开始

有办法做到这一点吗? 谢谢你!

高赞回答

在看高赞回答之前,我们先了解一下 Blender 相关的知识点

占位符功能

如果你为每台机器设置 相同的渲染输出路径 到某个目录,勾选 占位符Placeholders),同时取消勾选 覆盖Overwrite),那你就可以同时渲染两者。

工作原理

如果一台机器启动了一个帧,它会创建一个 占位符 文件,如果另一台机器试图写入同一帧,则它就不能写入,因为它认为该帧已经在那就位了,所以继续处理下一帧,以此类推。

例如

机器 1 开始第 1 帧,创建一个 占位符机器 2 从 2 开始。 现在 机器 1 已经完成,机器 2 正在工作, 机器 1 想要渲染第 2 帧,但是第 2 帧已经(占位符)在文件夹中,则它继续渲染第 3 帧,以此类推。 每当机器找到一个占位符,它就跳过这个帧,继续下一个帧。

  • 默认设置

【翻译】Blender 如何直接反向渲染并输出帧

  • 同时渲染的设置

【翻译】Blender 如何直接反向渲染并输出帧

答案给的脚本

你可以使用下面的 Python 脚本 来渲染你的动画,而不是使用 Blender 的默认渲染动画功能

  • 完整代码与注释如下
C = bpy.context
# 场景对象 scene object 
SCN = bpy.context.scene 

# 保存动画的目录/名称
orig_path = SCN.render.filepath

# 起始帧(int)
startframe = SCN.frame_start
# 结束帧(int)
endframe = SCN.frame_end
# 帧列表逆序
reversed_frames = list(range(endframe, startframe-1, -1))
# 用于保存渲染的文件扩展名
img_ext = SCN.render.file_extension

# 从(逆序后的)列表中取出帧
for fr in reversed_frames:
    
    # 设置场景帧并立即更新所有对象
    SCN.frame_set(fr)

    # 格式化输出文件名称 format output file names
    rendered_image_path = f"{orig_path}{fr:04}{img_ext}"

    # 防止 “覆盖” 功能 disable overwrite
    if os.path.exists(rendered_image_path):
        print(f"{rendered_image_path} exists")
        continue

    # “占位符” 功能 place holder functionality
    with open(rendered_image_path, 'w') as touchfile:
        pass
    
    # 打印一帧的渲染路径
    print(f"Initiating render Frame - {fr} -{rendered_image_path}")
    # 更新渲染路径
    SCN.render.filepath = rendered_image_path
    # 渲染活动场景
    # 写图像,保存渲染的图像到输出路径(仅在禁用动画时使用)
    bpy.ops.render.render(write_still=True)

# 恢复原始渲染路径
SCN.render.filepath = orig_path

上面的脚本实现了 占位符 功能并防止覆盖

缺点: 使用 GUI 渲染时看不到渲染窗口

转载自:https://juejin.cn/post/7165101459103875108
评论
请登录