1
$\begingroup$

I'm trying to get a list of currently activated render passes for a view layer.

For a scene 'Scene' and a view layer labelled 'my_vl', I can query individual pass status by returning True or False (e.g. the normal pass) like this:

bpy.data.scenes['Scene'].view_layers['my_vl'].use_pass_normal

or

bpy.context.view_layer.use_pass_normal

But is there a way to return a list of activated passes?

(I assume the Render Layers compositing node queries the passes to activate its outputs, but I can't figure out how.)

I found this update_render_passes method, but I'm not familiar with its purpose or useage:

bpy.context.view_layer.update_render_passes()

..and I get nothing in the console after running it as above.

$\endgroup$

1 Answer 1

1
$\begingroup$

I am not sure if there is a better method to do this but....

You can test all of the "use_pass_****" attribute in view-layer (and also eevee, cycles):

[
    attr
    for attr in dir(C.view_layer)
    if attr.startswith("use_pass") and getattr(C.view_layer, attr) == True
]  # -> ['use_pass_combined', 'use_pass_mist', 'use_pass_normal', 'use_pass_z']

And eevee-only pass:

[
    attr
    for attr in dir(C.view_layer.eevee)
    if attr.startswith("use_pass") and getattr(C.view_layer.eevee, attr) == True
]  # -> ['use_pass_volume_scatter', 'use_pass_volume_transmittance']

After seeking in Render Layer node, there is a outputs attribute contain different outputs that a node can potentially have. And each output can be enabled by attribute enable:

enter image description here

[
    key
    for key, output
    in C.scene.node_tree.nodes["Render Layers"].outputs.items()
    if getattr(output, 'enabled', False)
]  # -> ['Image', 'Alpha', 'Depth', 'Mist', 'Normal']
$\endgroup$
5
  • 1
    $\begingroup$ Thanks for the suggestions. Your use of list comprehension is elegant, and will improve what I have currently. However, passes like the denoise passes aren't caught by the 'use_pass' or other common term. I am curious if there is a more direct method to query the activated passes (as labeled on the Render Layer node outputs). $\endgroup$
    – nodster
    Commented Sep 4, 2020 at 20:30
  • $\begingroup$ I update the method and it should find every node output inside render layer. But it's kind of unlink between two object from UI properties panel and the node tree. Not sure if there is a linked bl_id for it. $\endgroup$
    – HikariTW
    Commented Sep 5, 2020 at 1:12
  • $\begingroup$ This works perfectly! Thank you! One question: for the getattr arguments, what is the 'False' component doing? (This method seems to work with just the 'output' and 'enabled' arguments - omitting 'False'.) $\endgroup$
    – nodster
    Commented Sep 6, 2020 at 1:14
  • $\begingroup$ @nodster It should work but due to the complexity of Blender implementation, using a explicit default value is convenient. getattr — Python 3.8.5 documentation $\endgroup$
    – HikariTW
    Commented Sep 6, 2020 at 5:47
  • $\begingroup$ Ah! Thanks for the explanation and the link. Your help is greatly appreciated! $\endgroup$
    – nodster
    Commented Sep 6, 2020 at 7:25

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .