Python在Unreal中提交Deadline渲染

简述

这篇文章主要是分享如何在UE里面配置Deadline渲染,以及如何用Python来实现自动化。

deadline下载页面: https://downloads.thinkboxsoftware.com/

  • Deadline版本:10.3.1
  • Unreal Engine版本:5.6

需要注意的是,UE不像通常DCC软件,它不能单个机器渲染单个帧。
农场分发最小单位为单个Level Sequence,即为每台电脑渲染一个Sequencer

image.png

在UE中安装Deadline插件

1.在你的项目目录中,新建Plugins文件夹。
将插件从Deadline仓库的plugins\UnrealEngine5\UnrealEnginePlugins这个位置拷贝进项目的Plugins文件夹。

image.png

然后启动项目,这个时候大概率会弹提示,说版本不对要重新编译。

image.png

点完Yes大概率也编译不成功,接下来试试我的方法。

先把两个插件从Plugins目录移除,放在一个别的位置。

执行下面的命令来编译UnrealDeadlineService
(-package 参数为编译后的目标路径)

shell
1
"C:\Program Files\Epic Games\UE_5.6\Engine\Build\BatchFiles\RunUAT.bat" BuildPlugin -plugin="D:\test\rebuild_ue_plugins\UnrealDeadlineService\UnrealDeadlineService.uplugin" -package="D:\test\rebuild_ue_plugins\5.6\UnrealDeadlineService"

注意:编译前需要安装 Visual Studio 2022,并按照官方说明文档进行组件安装。

image.png

编译UnrealDeadlineService成功后,拷贝到自己项目的Plugins中,启动UE。
在插件管理器中加载UnrealDeadlineService插件,然后关闭UE。

再将MoviePipelineDeadline拷贝到Plugins目录,启动UE。
这个时候应该会弹窗,提示编译MoviePipelineDeadline,点击Yes。

等待编译成功,就可以在插件管理器加载两个插件了。

image.png

尝试手动提交Deadline任务

1.打开Project Settings,搜索”movie render”关键字,修改Default Remote ExecutorDefault Executor Job两个设置。

image.png

2.创建一个Deadline Job Preset

image.png

创建后,右键Edit,可以修改这个任务的任务名,用什么池或组。

image.png

3.创建一个新的LevelSequencer相机,简单key一个动画,然后打开Movie Render Queue

image.png

4.在打开的Movie Render Queue中,为任务指定deadline预设。

image.png

5.点击 Render(Remote) 按钮,提交渲染。
正常来说这里就把任务提交到Deadline了。

不过遇到了报错:

image.png

看下日志

image.png

找到插件中的这个文件 Plugins\MoviePipelineDeadline\Content\Python\remote_executor.py

python
1
2
3
# line 338
if setting.get_class() == unreal.MoviePipelineGameOverrideSetting.static_class():
game_override_class = setting.game_mode_override

查看一下setting是个unreal.MoviePipelineGameOverrideSetting对象。
文档里有说明game_mode_override方法被弃用,推荐用soft_game_mode_override

image.png

修改代码,重启UE。

python
1
2
if setting.get_class() == unreal.MoviePipelineGameOverrideSetting.static_class():
game_override_class = setting.soft_game_mode_override

再试一次,提交成功并渲染完成了。

image.png

image.png

使用脚本提交渲染

1.首先创建Deadline Job Preset

python
1
2
3
4
5
6
7
8
9
10
11
import unreal

presets_name = 'my_seq_deadline_presets'
path = '/Game/Sequencer/Presets'
asset_tool = unreal.AssetToolsHelpers.get_asset_tools()

# 创建Deadline任务预设
presets = asset_tool.create_asset(asset_name=presets_name,
package_path=path,
asset_class=unreal.DeadlineJobPreset,
factory=unreal.DeadlineJobPresetFactory())

image.png

2.修改deadline任务参数,并保存。

python
1
2
3
4
5
6
7
8
# 修改一些任务参数
presets.job_preset_struct.name = 'My Test Preset'
presets.job_preset_struct.comment = 'This is a test preset...'
presets.job_preset_struct.priority = 100
presets.job_preset_struct.group = 'unreal'

# 保存
unreal.EditorAssetLibrary.save_asset(presets.get_path_name(), True)

image.png

3.创建渲染设置

python
1
2
3
4
5
6
7
8
9
10
presets_name = 'my_seq_render_presets'
path = '/Game/Sequencer/Presets'

# 创建渲染设置
render_config = asset_tool.create_asset(
asset_name=presets_name,
package_path=path,
asset_class=unreal.MoviePipelinePrimaryConfig,
factory=unreal.MoviePipelinePrimaryConfigFactory()
)

image.png

4.修改渲染设置

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 输出路径
output_path = r'D:\test\test_ue_output\{version}'

# 获取输出设置对象
output_setting = render_config.find_or_add_setting_by_class(unreal.MoviePipelineOutputSetting)

# 修改一些输出设置
output_setting.output_directory = unreal.DirectoryPath(output_path)
output_setting.file_name_format = r'{sequence_name}_lay_{version}.{frame_number}'
output_setting.use_custom_frame_rate = True
output_setting.output_frame_rate = unreal.FrameRate(numerator=24000, denominator=1001)
output_setting.output_resolution = unreal.IntPoint(1920, 1080)

# 添加渲染格式
render_config.find_or_add_setting_by_class(unreal.MoviePipelineImageSequenceOutput_EXR)
# 添加延迟渲染设置
render_config.find_or_add_setting_by_class(unreal.MoviePipelineDeferredPassBase)

# 保存
unreal.EditorAssetLibrary.save_asset(render_config.get_path_name(), True)

image.png

5.在Movie Render Queue里添加Sequencer渲染任务。

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建一个新的渲染任务
new_job = pipeline_queue.allocate_new_job(unreal.MoviePipelineDeadlineExecutorJob)

# 设置level
level_path = "/Game/testaa.testaa"
level_asset = unreal.SoftObjectPath(level_path)
new_job.map = level_asset

# 设置Sequencer
sequence_path = "/Game/my_seq.my_seq"
level_sequence = unreal.SoftObjectPath(sequence_path)
new_job.sequence = level_sequence

# 任务名称
new_job.job_name = 'my_seq'

image.png

6.指定configjob preset

python
1
2
new_job.job_preset = presets  
new_job.set_configuration(render_config)

image.png

到这里就设置完成了,点击渲染即可。

参考文档

deadline文档如何在UE中配置插件
https://docs.thinkboxsoftware.com/products/deadline/10.3/1_User%20Manual/manual/app-unreal-engine-5.html

如何将影片渲染队列用于高质量渲染
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/rendering-high-quality-frames-with-movie-render-queue-in-unreal-engine?application_version=5.0#renderinglocallyversusremotely

Movie Render Queue使用说明
https://dev.epicgames.com/documentation/en-us/unreal-engine/render-cinematics-in-unreal-engine?application_version=5.4

MoviePipelineExecutorJob 对象
https://dev.epicgames.com/documentation/en-us/unreal-engine/python-api/class/MoviePipelineExecutorJob?application_version=5.6#unreal.MoviePipelineExecutorJob

如何使用命令行渲染
https://github.com/leixingyu/unrealUtil/blob/master/render/renderCmd.py