Andere Antworten hier schlagen vor, eine Textur zu verwenden. Hier ist eine Technik, bei der keine Texturen verwendet werden.
Sie möchten, dass die Grenzen zwischen Sechsecken interessant sind. Es ist einfacher, interessante Grenzen zu setzen, wenn Sie sie in die Mitte des Zeichens verschieben. Anstatt die Kacheln direkt zu zeichnen, zeichnen Sie das „Dual“ der Kachel. Diese Technik wird als "Eckplättchen" bezeichnet ( hier und hier und hier ). Das Dual eines Sechsecks ist ein Dreieck, also würden wir diese Dreiecke anstelle der Sechsecke zeichnen:
Die Grenzen zwischen den Sechsecken befinden sich jetzt in der Mitte der gerenderten Dreiecke, sodass wir interessantere Dinge mit ihnen machen können. Bonus: Sie müssen nur zwei Dreiecke pro Sechseck zeichnen , anstatt sechs (oder vierundzwanzig, wie Sie es jetzt tun).
In jedem dieser Dreiecke soll der Fragment-Shader die Sechsecke zeichnen. Wir können das mit Schwerpunktkoordinaten tun . Setzen Sie (1,0,0), (0,1,0) und (0,0,1) an jeden Scheitelpunkt des Dreiecks. Innerhalb des Dreiecks werden diese Koordinaten interpoliert. Der Fragment-Shader empfängt (a, b, c) und kann sehen, welcher Wert am größten ist - das sagt uns, welches der drei Sechsecke an dieser Stelle gezeichnet werden soll.
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; }
Das ist für gerade Linien.
Wenn Sie verrauschte Kanten wünschen, können Sie den Schwerpunktkoordinaten Rauschen hinzufügen:
Wenn Sie mit der Amplitude Wellenlänge / Frequenz des Rauschens spielen, können Sie einige coole Effekte erzielen:
Sie müssen mit dem Rauschen vorsichtig sein und sicherstellen, dass es über Dreiecksgrenzen hinweg konsistent ist. Eine Möglichkeit, dies zu tun, besteht darin, eine Hex-ID einzugeben und diese als Startwert für jeden der drei Rauschwerte zu verwenden, die zu den Schwerpunktkoordinaten hinzugefügt werden.
Ich machte eine interaktive Demo hier . (Für die Demo habe ich weder die Hex-ID noch einige andere Dinge implementiert, die Sie möglicherweise benötigen, wenn Sie diese Arbeit in einem echten Projekt ausführen möchten - es ist nur eine schnelle und schmutzige Demo.)