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
    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
    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
    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
    Jul 28, 2015 at 12:20
  • 1
    $\begingroup$ that's shown here i.stack.imgur.com/cjlRu.png , The attribute node can output the values stored in the Vertex Color layer (you can have multiple layers) $\endgroup$
    – zeffii
    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 

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.