Các câu trả lời khác ở đây đề nghị sử dụng một kết cấu. Đây là một kỹ thuật không sử dụng kết cấu.
Bạn muốn ranh giới giữa các hình lục giác trở nên thú vị. Sẽ dễ dàng hơn để tạo ranh giới thú vị khi bạn di chuyển chúng vào trung tâm của những gì bạn đang vẽ. Thay vì vẽ các ô trực tiếp, bạn vẽ các hình nền kép của gạch. Kỹ thuật này được gọi là góc góc gạch ốp tường ( ở đây và ở đây và ở đây ). Hình kép của hình lục giác là hình tam giác, vì vậy chúng tôi sẽ vẽ những hình tam giác này thay vì hình lục giác:
Ranh giới giữa các hình lục giác hiện ở giữa các hình tam giác được hiển thị, vì vậy điều đó sẽ cho phép chúng tôi làm những điều thú vị hơn với chúng. Phần thưởng: bạn chỉ cần vẽ hai hình tam giác trên mỗi hình lục giác, thay vì sáu (hoặc hai mươi bốn như bạn đang làm bây giờ).
Bên trong mỗi hình tam giác đó, chúng tôi muốn shader mảnh để vẽ các hình lục giác. Chúng ta có thể làm điều đó với tọa độ barycentric . Đặt (1,0,0), (0,1,0) và (0,0,1) tại mỗi đỉnh của tam giác. Bên trong tam giác, các tọa độ đó sẽ được nội suy. Shader mảnh sẽ nhận được (a, b, c) và có thể xem để xem giá trị nào lớn nhất - sẽ cho chúng ta biết nên vẽ hình lục giác nào trong ba hình lục giác tại thời điểm này.
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; }
Đó là cho các đường thẳng.
Nếu bạn muốn các cạnh nhiễu, bạn có thể thêm nhiễu vào tọa độ barycentric:
Bằng cách chơi với bước sóng / tần số biên độ nhiễu, bạn có thể nhận được một số hiệu ứng thú vị:
Bạn cần cẩn thận với tiếng ồn, đảm bảo nó nhất quán trên các ranh giới tam giác. Một cách để làm điều đó là truyền vào id hex và sử dụng giá trị đó làm giá trị hạt giống cho mỗi trong ba giá trị nhiễu được thêm vào tọa độ barycentric.
Tôi đã làm một bản demo tương tác ở đây . (Đối với bản demo tôi đã không triển khai id hex hoặc một số thứ khác bạn có thể cần nếu bạn thực hiện công việc này trong một dự án thực tế - đó chỉ là bản demo nhanh & bẩn)