I am having a mesh. Every face has a ID. There is also a python dictionary where the IDs are mapped to a RGB value (or something else, which can map ID -> RGB. I am just thinking theoretically).

Now I want to have a node setup which colors the surface of the mesh dependent of the RGB value (I am also using these node groups (https://jtheninja.wordpress.com/2015/02/08/simple-pbr-v2/) because I want to see it with pbr values. Later I also want to have values for roughess and metallic for each face).

I am unsure which of the following node-types I should use for that:

  • Attribute Node (has output for color)
  • value Node (has output for floats, so I would need three value nodes and make a color-vector out of it?)
  • Script Node (Only for Open-Shading-Language scripts, am I right? Shouldn't help)

I need a node type which could access the ID Properties of the current object. I also need a node which also "knows" the face it is currently working and gets the face-id.

Any advice? Thanks!

  • 1
    $\begingroup$ is there a reason you aren't using vertex_colors? $\endgroup$
    – zeffii
    Commented Jul 28, 2015 at 11:48
  • $\begingroup$ The color in the face isn't changing. So I do need to save the RGB-Values only one time instead of 3 or more. But thanks for the link! :D Are vertex_colors for every face or for every vertex? For example face A is green, face B is blue, face B is directly next to A, so they share some vertices. Can I do that with vertex_colors, too? $\endgroup$
    – Hamburml
    Commented Jul 28, 2015 at 11:56
  • $\begingroup$ For my master thesis I would like to propose the perfect way so the solution "one face - one colour" would be the best. But now I want to know how I can determine, when a vertex has more than one vertex colour, which colour is for the current face? Or should I ask another question? $\endgroup$
    – Hamburml
    Commented Jul 28, 2015 at 12:12
  • 1
    $\begingroup$ for instance, this works on a cube (if you have a vertex_color map created) gist.github.com/zeffii/86fdbec4e58d5cf86fd1 $\endgroup$
    – zeffii
    Commented Jul 28, 2015 at 12:20
  • 1
    $\begingroup$ that's shown here i.sstatic.net/cjlRu.png , The attribute node can output the values stored in the Vertex Color layer (you can have multiple layers) $\endgroup$
    – zeffii
    Commented Jul 28, 2015 at 12:30

1 Answer 1


You can store the face ID as a vertex color o each face then read the vertex color using the Attribute node. This script will create a vertex color layer and store the face index as color :

import bpy

obj = bpy.context.object
obj_data = obj.data
group_name = 'face_ID'

#check for existing group with the same name
if None == obj_data.vertex_colors.get(group_name): 
color_map =  obj_data.vertex_colors[group_name]

#get faces' number 
count = len(obj_data.polygons)

for poly in obj_data.polygons:

    ID = poly.index / count  #for normalized results
    color = (ID, ID, ID)
    for loop_ind in poly.loop_indices:
        color_map.data[loop_ind].color = color 

You must log in to answer this question.

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