使用迭代像素的 Pynodes 创建自定义 Blender 合成节点 - 这可能吗?

Creating custom Blender composition node with Pynodes which iterates over pixels - is it possible?

我想为接收 e 的 Blender 创建一个组合节点。 G。 RenderLayers 节点的输出并迭代它的像素(如果我是正确的,它的输出是每个像素的颜色值)并计算它们的平均颜色值。可能吗?更具体地说,某个位置的输出颜色值是否可以访问它自己的任何其他位置的输入颜色值?

Pynode 旨在允许开发人员编写整个自定义节点树,而不是允许将一个自定义节点添加到现有 material 或合成节点树中。众所周知,自动更新存在问题,这可能已经改变,因为我还没有 looked for a while 但 sverchok 和动画节点仍然会自行处理更新。

一般来说,节点被设计成小项目,处理当前正在计算的像素的一个结果。虽然一些内置节点可以查看周围的像素,但我不认为 pynodes 可以做到这一点。

我会建议只访问完整图像而不是自定义 pynode 的脚本。这可以合并到一个运算符中,该运算符可以在 UV/Image 编辑器中用于当前图像。

Blender 的图像 class 包含一个 pixels property 提供对原始图像数据的访问。

import bpy

src_image = bpy.data.images['src']
w, h = src_image.size[0], src_image.size[1]

sum_r = 0
sum_g = 0
sum_b = 0
sum_a = 0

for x in range(w):
    for y in range(h):
        idx = ((y * w) + x) * src_image.channels
        sum_r += src_image.pixels[idx]
        sum_g += src_image.pixels[idx+1]
        sum_b += src_image.pixels[idx+2]
        sum_a += src_image.pixels[idx+3]

pix_count = len(src_image.pixels) / src_image.channels
avg_r = sum_r / pix_count
avg_g = sum_g / pix_count
avg_b = sum_b / pix_count
avg_a = sum_a / pix_count

print('red:{} green:{} blue:{} alpha:{}'.format(avg_r,avg_g,avg_b,avg_a))