Distributed rendering of single images #104327
@ -142,6 +142,8 @@ function renderOutputPath(job) {
|
||||
});
|
||||
}
|
||||
|
||||
// Calculate the borders for the tiles
|
||||
// Does not take into account the overscan
|
||||
function calcBorders(tileSizeX, tileSizeY, width, height) {
|
||||
let borders = [];
|
||||
for (let y = 0; y < height; y += tileSizeY) {
|
||||
@ -159,6 +161,7 @@ function authorRenderTasks(settings, renderDir, renderOutput) {
|
||||
let borders = calcBorders(settings.tile_size_x, settings.tile_size_y, settings.resolution_x, settings.resolution_y);
|
||||
for (let border of borders) {
|
||||
const task = author.Task(`render-${border[0]}-${border[1]}`, "blender");
|
||||
// Overscan is calculated in this manner to avoid rendering outside the image resolution
|
||||
let pythonExpr = `import bpy
|
||||
|
||||
scene = bpy.context.scene
|
||||
@ -195,6 +198,16 @@ bpy.ops.render.render(write_still=True)`
|
||||
function authorMergeTask(settings, renderDir, renderOutput) {
|
||||
print("authorMergeTask(", renderDir, ")");
|
||||
const task = author.Task("merge", "blender");
|
||||
// Burning metadata into the image is done by the compositor for the entire merged image
|
||||
// The overall logic of the merge is as follows:
|
||||
// 1. Find out the Render Layers node and to which socket it is connected
|
||||
// 2. Load image files from the tiles directory.
|
||||
// Their correct position is determined by their filename.
|
||||
// 3. Create a node tree that scales, translates and adds the tiles together.
|
||||
// A simple version of the node tree is linked here:
|
||||
// https://devtalk.blender.org/uploads/default/original/3X/f/0/f047f221c70955b32e4b455e53453c5df716079e.jpeg
|
||||
// 4. The final image is then fed into the socket the Render Layers node was connected to.
|
||||
// This allows the compositing to work as if the image was rendered in one go.
|
||||
let pythonExpr = `import bpy
|
||||
|
||||
render = bpy.context.scene.render
|
||||
|
Loading…
Reference in New Issue
Block a user