First of all I know that the easiest and probably the most efficient and the fastest way would be to add File Output with different inputs, but as far as it is possible I'd like to avoid writing unnecessary files on disc. For my addon I'd like to store all pixels from all render passes to numpy array and then move the results to the generated multilayer image without writing it on disc.
Pixels can be gotten from bpy.data.images['Viewer Node'].pixels
, and with Python it is possible to reconnect Viewer node in Compositor to each pass and got particular pass's pixels from there. It starts to be complicated when you have not just a single View Layer but dozens of different Render Layers in Compositor, and worse - Viewer node gives only 4 channel RGBA image, while the passes may be of other types: some of them are values (depth, mist, ao), some are vectors (normals), etc.
Of course I could write a couple hundreds more lines of code to find out node.outputs[0].type
for each Render Layer output, write for each type an algorithm to convert its RGBA Viewer result back to its original type and store them to array. This seems to be unnatural and weird way (comparing to something like ...nodes['Render Layers'].output[0].image.pixels
) which takes additional memory, processing time and effort. But we all know those unexplainable limits in Blender's API and from time to time each of us has to do weird things. (Still hope there's more straight forward way of doing this which I've missed).
But how can I store pixels from an array to different image layers? I can generate an image in Blender and set its type to "MULTILAYER", but I haven't found any additional options like image.layers[0]
appear after that. More to say, I've tried to find a path to existing Open EXR Multilayer file's different layers through API - and failed. And of course multilayer's self pixels, size, channels, resolution and other parameters are returned as 0, which is very similar to what we've got from 'Render Result' image.
To summarize.
The best and more obvious way would be if there was something like bpy.data.images['Render Result'].passes[0].pixels
and the same for multilayer images.
- Is it true? The problem to get an access to render results in Blender is actual for almost 7 years and yet we still don't have a solution in 2020?
- There's no way to access/change individual multilayer image's layers' data through blender API?
UPDATE.
This is a known feature. At the moment there is no access to multilayer images' pixels through API. But the thread is not closed, so still there is a hope this will be improved.