Другие ответы здесь предлагают использовать текстуру. Вот техника, которая не использует текстуры.
Вы хотите, чтобы границы между шестиугольниками были интересными. Проще сделать интересные границы, когда вы перемещаете их в центр того, что рисуете. Вместо того, чтобы рисовать плитки напрямую, вы рисуете «двойник» плитки. Эта техника называется «угловая плитка» ( здесь и здесь, и здесь ). Двойником шестиугольника является треугольник, поэтому мы будем рисовать эти треугольники вместо шестиугольников:
Границы между шестиугольниками теперь находятся в середине визуализированных треугольников, так что это позволит нам делать с ними более интересные вещи. Бонус: вам нужно нарисовать только два треугольника на шестиугольник вместо шести (или двадцати четырех, как вы делаете сейчас).
Внутри каждого из этих треугольников мы хотим, чтобы фрагментный шейдер рисовал шестиугольники. Мы можем сделать это с помощью барицентрических координат . Положите (1,0,0), (0,1,0) и (0,0,1) в каждой вершине треугольника. Внутри треугольника эти координаты будут интерполированы. Фрагментный шейдер получит (a, b, c) и может посмотреть, какое значение является наибольшим - это скажет нам, какой из трех шестиугольников следует нарисовать в этой точке.
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; }
Это для прямых.
Если вы хотите шумные ребра, вы можете добавить шум к барицентрическим координатам:
Играя с амплитудой длина волны / частота шума, вы можете получить некоторые интересные эффекты:
Вы должны быть осторожны с шумом, следя за тем, чтобы он соответствовал границам треугольника. Один из способов сделать это - передать шестнадцатеричный идентификатор и использовать его в качестве начального значения для каждого из трех значений шума, добавляемых к барицентрическим координатам.
Я сделал интерактивную демонстрацию здесь . (Для демонстрации я не реализовал шестнадцатеричный идентификатор или некоторые другие вещи, которые могут вам понадобиться, если вы выполняли эту работу в реальном проекте - это просто быстрая и грязная демонстрация)