Otras respuestas aquí sugieren usar una textura. Aquí hay una técnica que no usa texturas.
Desea que los límites entre hexágonos sean interesantes. Es más fácil establecer límites interesantes cuando los mueve al centro de lo que está dibujando. En lugar de dibujar los mosaicos directamente, dibuja el "dual" del mosaico. Esta técnica se llama “azulejos de esquina” ( aquí y aquí y aquí ). El dual de un hexágono es un triángulo, por lo que dibujaríamos estos triángulos en lugar de los hexágonos:
Los límites entre los hexágonos ahora están en el medio de los triángulos renderizados, por lo que nos permitirá hacer cosas más interesantes con ellos. Bonificación: solo necesitas dibujar dos triángulos por hexágono, en lugar de seis (o veinticuatro como lo estás haciendo ahora).
Dentro de cada uno de esos triángulos queremos que el sombreador de fragmentos dibuje los hexágonos. Podemos hacer eso con coordenadas barcéntricas . Ponga (1,0,0), (0,1,0) y (0,0,1) en cada vértice del triángulo. Dentro del triángulo, esas coordenadas serán interpoladas. El sombreador de fragmentos recibirá (a, b, c) y puede mirar para ver qué valor es el más grande; eso nos dirá cuál de los tres hexágonos se debe dibujar en este punto.
float max_n = max(barycentric.r, max(barycentric.g, barycentric.b));
if (max_n == barycentric.r) { color = v_color0; }
else if (max_n == barycentric.g) { color = v_color1; }
else if (max_n == barycentric.b) { color = v_color2; }
Eso es para líneas rectas.
Si desea bordes ruidosos, puede agregar ruido a las coordenadas barcéntricas:
Al jugar con la amplitud de onda / frecuencia de ruido, puede obtener algunos efectos geniales:
Debe tener cuidado con el ruido, asegurándose de que sea consistente a través de los límites de los triángulos. Una forma de hacerlo es pasar una identificación hexadecimal y usarla como valor inicial para cada uno de los tres valores de ruido agregados a las coordenadas barcéntricas.
Hice una demostración interactiva aquí . (Para la demostración, no implementé la identificación hexadecimal o algunas de las otras cosas que podría necesitar si estuviera haciendo que esto funcione en un proyecto real, es solo una demostración rápida y sucia)