Use 2 chromosomes. The first one is a list of 3D positions (xyz float coordinates) and the second a list of colors (rgb) of the same size. I used 200 triangles.

I used a population size of 50, rank selection (pick the 25 most fit in each generation), coordinate- and color channel-wise mutation rate of 0.001, crossover rate of 0.7.

Uniform crossovers – each coordinate/color component gets an equal chance to come from parent1 or parent2.

Render from the front and side. I used XY and ZY coordinate pairs.

Compute the difference between the input image and the rendered image. To do this with OpenGL, I render two passes: one with Subtract and another with ReverseSubtract blend, then Add them together.

Calculate the sum of differences and use this as a fitness value.