Distributed rendering of single images #104327
@ -17,7 +17,7 @@ const JOB_TYPE = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "frame", type: "int32", required: true,
|
key: "frame", type: "int32", required: true,
|
||||||
eval: "f'{C.scene.frame_current}'",
|
eval: "C.scene.frame_current",
|
||||||
description: "Frame to render. Examples: '47', '1'"
|
description: "Frame to render. Examples: '47', '1'"
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -68,6 +68,22 @@ const JOB_TYPE = {
|
|||||||
visible: "hidden",
|
visible: "hidden",
|
||||||
description: "File extension used when rendering images"
|
description: "File extension used when rendering images"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: "resolution_x",
|
||||||
|
type: "int32",
|
||||||
|
required: true,
|
||||||
|
eval: "C.scene.render.resolution_x",
|
||||||
|
visible: "hidden",
|
||||||
|
description: "Resolution X"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "resolution_y",
|
||||||
|
type: "int32",
|
||||||
|
required: true,
|
||||||
|
eval: "C.scene.render.resolution_y",
|
||||||
|
visible: "hidden",
|
||||||
|
description: "Resolution Y"
|
||||||
|
},
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -84,6 +100,10 @@ function compileJob(job) {
|
|||||||
|
|
||||||
const renderDir = path.dirname(renderOutput);
|
const renderDir = path.dirname(renderOutput);
|
||||||
const renderTasks = authorRenderTasks(settings, renderDir, renderOutput);
|
const renderTasks = authorRenderTasks(settings, renderDir, renderOutput);
|
||||||
|
|
||||||
|
for (const rt of renderTasks) {
|
||||||
|
job.addTask(rt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do field replacement on the render output path.
|
// Do field replacement on the render output path.
|
||||||
@ -103,7 +123,7 @@ function renderOutputPath(job) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function calcBorders(tileSizeX, tileSizeY, width, height) {
|
function calcBorders(tileSizeX, tileSizeY, width, height) {
|
||||||
borders = [];
|
let borders = [];
|
||||||
for (let y = 0; y < height; y += tileSizeY) {
|
for (let y = 0; y < height; y += tileSizeY) {
|
||||||
for (let x = 0; x < width; x += tileSizeX) {
|
for (let x = 0; x < width; x += tileSizeX) {
|
||||||
borders.push([x, y, Math.min(x + tileSizeX, width), Math.min(y + tileSizeY, height)]);
|
borders.push([x, y, Math.min(x + tileSizeX, width), Math.min(y + tileSizeY, height)]);
|
||||||
@ -116,9 +136,8 @@ function calcBorders(tileSizeX, tileSizeY, width, height) {
|
|||||||
function authorRenderTasks(settings, renderDir, renderOutput) {
|
function authorRenderTasks(settings, renderDir, renderOutput) {
|
||||||
print("authorRenderTasks(", renderDir, renderOutput, ")");
|
print("authorRenderTasks(", renderDir, renderOutput, ")");
|
||||||
let renderTasks = [];
|
let renderTasks = [];
|
||||||
render = C.scene.render;
|
let borders = calcBorders(settings.tile_size_x, settings.tile_size_y, settings.resolution_x, settings.resolution_y);
|
||||||
let borders = calcBorders(settings.tile_size_x, settings.tile_size_y, render.resolution_x, render.resolution_y);
|
for (let border of borders) {
|
||||||
for (border of borders) {
|
|
||||||
const task = author.Task(`render-${border[0]}-${border[1]}`, "blender");
|
const task = author.Task(`render-${border[0]}-${border[1]}`, "blender");
|
||||||
let pythonExpr = `import bpy
|
let pythonExpr = `import bpy
|
||||||
|
|
||||||
@ -126,18 +145,19 @@ render = bpy.context.scene.render
|
|||||||
render.image_settings.file_format = 'OPEN_EXR_MULTILAYER'
|
render.image_settings.file_format = 'OPEN_EXR_MULTILAYER'
|
||||||
render.use_compositing = False
|
render.use_compositing = False
|
||||||
|
|
||||||
render.border_min_x = ${border[0]} // settings.resolution_x
|
render.border_min_x = ${border[0]} / ${settings.resolution_x}
|
||||||
render.border_min_y = ${border[1]} // settings.resolution_y
|
render.border_min_y = ${border[1]} / ${settings.resolution_y}
|
||||||
render.border_max_x = ${border[2]} // settings.resolution_x
|
render.border_max_x = ${border[2]} / ${settings.resolution_x}
|
||||||
render.border_max_y = ${border[3]} // settings.resolution_y
|
render.border_max_y = ${border[3]} / ${settings.resolution_y}
|
||||||
render.use_border = True`
|
render.use_border = True
|
||||||
|
bpy.ops.render.render(write_still=True)`
|
||||||
const command = author.Command("blender-render", {
|
const command = author.Command("blender-render", {
|
||||||
exe: "{blender}",
|
exe: "{blender}",
|
||||||
exeArgs: "{blenderArgs}",
|
exeArgs: "{blenderArgs}",
|
||||||
argsBefore: [],
|
argsBefore: [],
|
||||||
blendfile: settings.blendfile,
|
blendfile: settings.blendfile,
|
||||||
args: [
|
args: [
|
||||||
"--render-output", path.join(renderDir, path.basename(renderOutput)),
|
"--render-output", path.join(renderDir, path.basename(renderOutput), border[0] + "-" + border[1] + "-" + border[2] + "-" + border[3]),
|
||||||
"--render-format", settings.format,
|
"--render-format", settings.format,
|
||||||
"--python-expr", pythonExpr
|
"--python-expr", pythonExpr
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user