Altre risposte qui suggeriscono di usare una trama. Ecco una tecnica che non usa trame.
Vuoi che i confini tra gli esagoni siano interessanti. È più facile creare confini interessanti quando li sposti al centro di ciò che stai disegnando. Invece di disegnare direttamente le tessere, si disegna il "doppio" della tessera. Questa tecnica è chiamata “porzioni d'angolo” ( qui e qui e qui ). Il doppio di un esagono è un triangolo, quindi disegneremmo questi triangoli invece degli esagoni:
I confini tra gli esagoni sono ora nel mezzo dei triangoli renderizzati, quindi questo ci permetterà di fare cose più interessanti con loro. Bonus: devi solo pescarne due triangoli per esagono, anziché sei (o ventiquattro come stai facendo ora).
All'interno di ciascuno di quei triangoli vogliamo che lo shader di frammenti disegni gli esagoni. Possiamo farlo con coordinate baricentriche . Metti (1,0,0), (0,1,0) e (0,0,1) su ciascun vertice del triangolo. All'interno del triangolo, tali coordinate saranno interpolate. Lo shader di frammento riceverà (a, b, c) e può vedere per vedere quale valore è il più grande - questo ci dirà quale dei tre esagoni dovrebbe essere disegnato a questo 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; }
Questo è per le linee rette.
Se vuoi bordi rumorosi, puoi aggiungere rumore alle coordinate baricentriche:
Giocando con l'ampiezza della lunghezza d'onda / frequenza del rumore, puoi ottenere alcuni effetti fantastici:
Devi stare attento con il rumore, assicurandoti che sia coerente attraverso i confini del triangolo. Un modo per farlo è passare un id esadecimale e usarlo come valore seed per ciascuno dei tre valori di rumore aggiunti alle coordinate baricentriche.
Ho fatto una demo interattiva qui . (Per la demo non ho implementato l'id esadecimale o alcune delle altre cose di cui potresti aver bisogno se facessi funzionare questo in un progetto reale - è solo una demo veloce e sporca)