Short answer:
.x3d, an xml based format. Color can be either specified
- per vertex of face
- per face ( colorPerVertex='false' )
When imported via Blender's importer either method get converted to a per vertex per face scheme for the vertex_color
layer.
Stanford .PLY format. (vertex colours are shared over all faces that use the vertex, only way to get color-per-face with this format is wasteful duplication of each vertex)
or
homegrown code: essentially this code. all you need to write is the part where you map the current polygon.index to a color, so all vertices of that loop are assigned the same colour.
Take a cube.
import bpy
indexed_colors = [
(1,0,0), (1,1,0), (1,0,1),
(0,0,1), (0,1,1), (0,1,0)]
obj = bpy.data.objects['Cube']
mesh = obj.data
# you probably know how to create the color layer..
if not mesh.vertex_colors:
# creates one 'Col' by default
obj.data.vertex_colors.new()
color_layer = mesh.vertex_colors['Col']
i = 0
for poly in mesh.polygons:
# print(poly.loop_indices)
color = indexed_colors[poly.index]
for idx in poly.loop_indices:
# loop = mesh.loops[idx]
# v = loop.vertex_index
color_layer.data[i].color = color[:3]
i +=1
More elaboration on mesh generation is here: How to create a mesh programmatically, without bmesh?
from_pydata
(docs link) :
mesh = bpy.data.meshes.new("mesh_name")
mesh.from_pydata(vertices=[], edges=[], faces=[])
mesh.update()
obj = bpy.data.objects.new("obj_name", mesh)
scene = bpy.context.scene
scene.objects.link(obj)
Showing vertex colors
For both methods you still need to configure the Object's material once imported, if you want it to show the vertex_color
layer. This configuration is relatively painless but slightly different depending on which render engine you intend to use.
For Cycles you use a node based material, shown here
For Blender's Internal renderer the process is covered here