如何在Blender 2.9中使用python将材质的基本颜色设置为相等的顶点颜色



这就是我实例化网格对象和材质的方式:

mymesh = bpy.data.meshes.new(objname)
myobject = bpy.data.objects.new(objname, mymesh)
mymat = bpy.data.materials.get("Material")
if mymat is None:
mymat = bpy.data.materials.new(name="Material")
if myobject.data.materials:
# assign to 1st material slot
myobject.data.materials[0] = mymat
else:
# no slots
myobject.data.materials.append(mymat)

以下是我如何设置顶点颜色的方法:

if len(mymesh.vertex_colors) == 0:
mymesh.vertex_colors.new()

for f in mymesh.vertex_colors[0].data:
f.color = rgb # (0,0,0,1) for black

当我处于顶点绘制模式时,我可以看到颜色,但当我使用Eevee或Cycles渲染场景时,颜色不会显示。

我可以通过使用UI将材质的基本颜色更改为等于"顶点颜色"来解决这个问题,但是我如何使用python代码来做到这一点呢?

编辑:也许解决方案使用bpy.data.materials["Material"].node_tree.nodes["Principled BSDF"].inputs

我想做一些类似的事情。我不知道你是否还在研究它,但这是我发现的解决方案,它似乎适用于Blender 2.92.0。

测试脚本:

  • 创建一个新的多维数据集(默认情况下命名为"多维数据集"(
  • 将脚本导入Blender中的脚本窗口
  • 点击";运行">
import bpy
from random import *
# ---------- SET RANDOM COLORS TO VERTICES ----------
# Load vertex colors data
mesh = bpy.data.objects["Cube"].data
if not mesh.vertex_colors:
mesh.vertex_colors.new()
print("Object had no vertex colors, adding them")
# Assign random colors to vertices
for vCol in mesh.vertex_colors[0].data:
for i in range(len(vCol.color) - 1):
vCol.color[i] = random()

# ---------- LOAD AND LINK MATERIAL TO MESH ----------
# Load material
mymat = bpy.data.materials.get("mymat")
if mymat is None:
mymat = bpy.data.materials.new(name = "mymat")

mymat.use_nodes = True

# Link material to mesh
if mesh.materials:
mesh.materials[0] = mymat
else:
mesh.materials.append(mymat)

# ---------- MANAGE NODES OF SHADER EDITOR ----------
# Get node tree from the material
nodes = mymat.node_tree.nodes
principled_bsdf_node = nodes.get("Principled BSDF")
# Get Vertex Color Node, create it if it does not exist in the current node tree
vertex_color_node = None
if not "VERTEX_COLOR" in [node.type for node in nodes]:
vertex_color_node = nodes.new(type = "ShaderNodeVertexColor")
else:
vertex_color_node = nodes.get("Vertex Color")
# Set the vertex_color layer we created at the beginning as input
vertex_color_node.layer_name = "Col"
# Link Vertex Color Node "Color" output to Principled BSDF Node "Base Color" input
links = mymat.node_tree.links
link = links.new(vertex_color_node.outputs[0], principled_bsdf_node.inputs[0])

以下是一些帮助我做到这一点的资源:

  • https://docs.blender.org/api/current/bpy.types.NodeLink.html?highlight=nodelink#bpy.types.NodeLink
  • https://docs.blender.org/api/current/bpy.types.ShaderNode.html
  • https://docs.blender.org/api/current/bpy.types.MeshLoopColor.html
  • https://blender.stackexchange.com/questions/23436/control-cycles-eevee-material-nodes-and-material-properties-using-python

最新更新