Outras respostas aqui sugerem o uso de uma textura. Aqui está uma técnica que não usa texturas.
Você deseja que os limites entre hexágonos sejam interessantes. É mais fácil estabelecer limites interessantes quando você os move para o centro do que está desenhando. Em vez de desenhar os ladrilhos diretamente, você desenha o "duplo" do ladrilho. Essa técnica é chamada de "esquadrias" ( aqui e aqui e aqui ). O dual de um hexágono é um triângulo, então desenhávamos esses triângulos em vez dos hexágonos:
Os limites entre hexágonos agora estão no meio dos triângulos renderizados, de modo que vamos fazer coisas mais interessantes com eles. Bônus: você só precisa desenhar dois triângulos por hexágono, em vez de seis (ou vinte e quatro como você está fazendo agora).
Dentro de cada um desses triângulos, queremos que o shader de fragmento desenhe os hexágonos. Podemos fazer isso com coordenadas baricêntricas . Coloque (1,0,0), (0,1,0) e (0,0,1) em cada vértice do triângulo. Dentro do triângulo, essas coordenadas serão interpoladas. O shader de fragmento receberá (a, b, c) e pode ver qual valor é maior - isso nos dirá qual dos três hexágonos deve ser desenhado neste momento.
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; }
Isso é para linhas retas.
Se você deseja bordas ruidosas, pode adicionar ruído às coordenadas baricêntricas:
Ao brincar com o comprimento de onda da amplitude / frequência do ruído, você pode obter alguns efeitos interessantes:
Você precisa ter cuidado com o ruído, certificando-se de que seja consistente através dos limites do triângulo. Uma maneira de fazer isso é passar um id hexadecimal e usá-lo como valor inicial para cada um dos três valores de ruído adicionados às coordenadas baricêntricas.
Eu fiz uma demonstração interativa aqui . (Para a demonstração, não implementei o ID hexadecimal ou outras coisas que você pode precisar se estiver fazendo esse trabalho em um projeto real - é apenas uma demonstração rápida e suja)