A saída do nó do visualizador do Compositor nunca é atualizada durante a renderização via script Python

Sep 22 2020

Com base nessa resposta , estou tentando extrair o RGB por quadro e os arrays de profundidade de algumas cenas de animação. No entanto, a camada de renderização do compositor e a configuração do nó do visualizador que estou construindo programaticamente não parecem funcionar. Estou conectando 2 saídas da camada de renderização a 2 entradas do nó do visualizador, mas qualquer chamada para render()não altera ou atualiza o pixelscampo do nó do visualizador - o próprio processo de renderização funciona (por exemplo, ele mostra coisas ao armazenar no um arquivo de saída), nada acontece no contexto do compositor. Todos os valores de saída são sempre zero.

Na verdade, até mesmo o tamanho / forma de pixelsestá incorreto (262144) e não depende de qualquer resolução de entrada que passei para o mecanismo de renderização.

Aqui está um exemplo mínimo para reproduzir o problema:

import bpy
import numpy as np

width = 640
height = 480

bpy.context.scene.render.engine = 'CYCLES'
bpy.context.scene.render.resolution_x = width
bpy.context.scene.render.resolution_y = height
bpy.context.scene.render.resolution_percentage = 100

bpy.context.scene.render.use_compositing = True
bpy.context.scene.use_nodes = True
tree = bpy.context.scene.node_tree
links = tree.links

for n in tree.nodes:
    tree.nodes.remove(n)
rl = tree.nodes.new('CompositorNodeRLayers')      

vl = tree.nodes.new('CompositorNodeViewer')   
vl.use_alpha = True
links.new(rl.outputs[0], vl.inputs[0])  # link Renger Image to Viewer Image
links.new(rl.outputs[2], vl.inputs[1])  # link Render Z to Viewer Alpha

# Render
bpy.ops.render.render()

# Get the pixels and put them into a numpy array
pixels = np.array(bpy.data.images['Viewer Node'].pixels)
print(len(pixels))

width = bpy.context.scene.render.resolution_x 
height = bpy.context.scene.render.resolution_y

# Reshaping into image array 4 channel (rgbz)
print('pixels:', pixels.shape)  # (262144, ) even though 640*480*4 = 1228800
print('values:', np.min(pixels), np.max(pixels))  # 0.0, 0.0
image = pixels.reshape((height, width, 4))  # Error

Estou usando o Blender 2.83.6 LTS e estou executando este comando para executar o script:

blender --background --python .\minimal_blender.py

Eu sinto que estou negligenciando algo simples (eu sou um iniciante no Blender depois de tudo), mas não consigo determinar o quê?

Observação: estou ciente de que --background pode ter algo a ver com isso, mas não consigo desabilitar essa opção, porque fazer isso introduz uma série de RuntimeError: Operator bpy.ops.wm.append.poll() failed, context is incorrecterros em todo o lugar em meu outro script, que não tenho ideia de como Consertar. Então eu acho que essa questão é essencialmente como forçar o nó do visualizador a atualizar ao executar o Blender em segundo plano.

Respostas

1 aviator Sep 25 2020 at 22:36

Resolvido - meu problema estava na verdade relacionado ao comportamento codificado do Blender no modo background, ao invés de algo errado com o próprio processo de renderização. Para que o Viewer Node funcione em segundo plano, você precisa modificar algum código-fonte e recompilar o Blender conforme descrito no link, pois ele está desabilitado por padrão por motivos de otimização. Então corra:

path\to\recompiled\blender --background --python my_render_script.py