Có hai nguyên nhân có thể gây ra loại vấn đề này, tùy thuộc vào chính xác đó là vấn đề gì. Tôi sẽ liệt kê cả hai:
1. Bạn đang nhìn thấy các màu khác từ kết cấu của bạn dọc theo các cạnh của gạch.
Điều này đối với tôi giống như vấn đề trong trường hợp này, bởi vì tất cả các pixel cạnh là một trong ba màu hợp lý trong kết cấu của bạn: trắng, đen và nâu.
Nếu bạn đang sử dụng nhiều hình ảnh xếp ngay cạnh nhau trong một kết cấu duy nhất (tập bản đồ kết cấu), như tôi giả sử bạn đang làm, điều này là không thể tránh khỏi. Điều này xảy ra do GPU không khớp hoàn hảo với phép nội suy dọc theo cạnh của một hình tam giác với phép nội suy dọc theo kết cấu và bạn sẽ có được một chút các kết cấu liền kề.
Có một số điều bạn có thể làm.
- Sử dụng một kết cấu mảng thay vì một tập bản đồ kết cấu. Một kết cấu mảng được tạo thành từ một chồng các hình ảnh 2D có cùng kích thước và bạn chỉ định tọa độ thứ ba để chọn một tọa độ; nó được dự định chính xác như là một sự thay thế cho các bản đồ kết cấu mà không có vấn đề lọc. Tuy nhiên, kết cấu mảng là một tính năng mới hơn có thể không có sẵn trong phiên bản OpenGL mà bạn đang sử dụng.
- Tạo đường viền 1 pixel trong mỗi ô kết cấu của bạn, sao chép màu của pixel thông thường liền kề. (Điều này về cơ bản là thực hiện lại GL
CLAMP[_TO_EDGE]
, nhưng theo cách nhận thức được các kết cấu - việc sử dụng của bạn không có tác dụng vì hầu hết các cạnh gạch của bạn không nằm ở cạnh của kết cấu.) Đây là giải pháp tôi sử dụng trong mục nhập của riêng tôi trong thể loại, hình khối . Tôi biết không có nhược điểm đặc biệt nào ngoại trừ việc nó sử dụng nhiều bộ nhớ kết cấu hơn.
- Rất ít chèn tọa độ kết cấu của bạn, để chúng không đi hết vào cạnh của gạch kết cấu. Làm điều này quá nhiều sẽ dẫn đến độ mỏng đáng chú ý của các cạnh của kết cấu so với các pixel ở giữa.
- Sử dụng một kết cấu duy nhất cho mỗi loại gạch. Điều này áp đặt chi phí chuyển đổi kết cấu.
2. Bạn đang nhìn xuyên qua những khoảng trống giữa các viên gạch.
Tôi không nghĩ rằng đây là vấn đề trong trường hợp này, vì không có mặt đất xanh nhìn thấy qua các khoảng trống, nhưng tôi bao gồm nó cho sự hoàn chỉnh.
Điều này có thể xảy ra khi bạn không cung cấp chính xác cùng tọa độ cho các đỉnh của các cạnh của gạch liền kề, thường phát sinh do lỗi dấu phẩy động. Ví dụ: nếu bạn có các ô có kích thước 0,6 và tính cạnh phải của ô ở x=100
cùng (100*0.6) + 0.6
và cạnh trái của ô ở x=101
cùng (100*0.6)
, bạn sẽ không nhận được câu trả lời chính xác tương tự và có thể thấy sự khác biệt như các đốm nhỏ những khoảng trống
Giải pháp là đảm bảo rằng số học của bạn phù hợp; Một số cách để làm điều này là:
- Hãy chắc chắn rằng bạn không (thậm chí gián tiếp) tính toán
index*size + size
, nhưng chỉ (index+1)*size
.
- Hãy chắc chắn rằng số học của bạn là chính xác; Cách dễ nhất để làm điều này là làm cho kích thước ô của bạn chính xác là 1.0, điều này sẽ dẫn đến số học số nguyên chính xác ngay cả khi bạn thực hiện các phép tính của mình với số float 32 bit (dù sao cũng có tới 16 triệu khối từ gốc).
- Sử dụng số nguyên thực tế để tính toán tọa độ đỉnh; điều này giúp bạn có nhiều phạm vi hơn.