OpenGL - các cạnh màu trắng trên hình khối


12

Trong một trò chơi giống như minecraft tôi đang thực hiện, tôi có các cạnh màu trắng trên các hình khối của mình:

nhập mô tả hình ảnh ở đây

Nó là đáng chú ý hơn nhiều trong kết cấu tối hơn. Các kết cấu đang được thiết lập như thế này: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Có ai giúp đỡ không?


3
Bạn có thể hiển thị một số mã về cách bạn kết xuất mỗi khối và cách bạn đặt khối không?
joncodo

1
Liệu gói kết cấu làm bất cứ điều gì khác nhau? Kết cấu trông như thế nào / kích thước mà bạn ràng buộc?
Chuck D

Tôi chỉ muốn chỉ ra rằng tôi đã thấy điều này cũng diễn ra trong các giai đoạn kết cấu lớn, sử dụng gạch nhỏ. Ví dụ: giả sử bạn có một lát / tập bản đồ 1024 * 1024 và sử dụng các ô của bạn là 32 * 32. Bạn nhận được các lỗi làm tròn bởi vì dấu thập phân mà ánh xạ tới ô xếp là một số rất nhỏ. Điều này làm cho độ chính xác gần như không thể. Một giải pháp? Phá vỡ các bản đồ gạch thành gạch riêng lẻ. Đây là những gì Minecraft làm, hoặc được sử dụng để làm. Họ có một viên gạch lớn, và trong thời gian chạy, họ cắt nó thành từng họa tiết riêng lẻ.
Krythic

Câu trả lời:


19

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=100cùng (100*0.6) + 0.6và cạnh trái của ô ở x=101cù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.

Trông giống như những khoảng trống đối với tôi - không chảy máu kết cấu (trừ khi nó có một số kết cấu độ phân giải cao) khi xem xét các bit nhỏ và sắc nét.
Mario

Cảm ơn, chèn các tọa độ kết cấu bằng một chút dường như để sửa nó.
Luis Cruz

@Mario Tôi giả sử điều này là với độ phóng đại NEAREST - lưu ý đường viền sắc nét trên phần bên trong của gạch. Vì vậy, đối với quan điểm đó, đó là một kết cấu độ phân giải vô hạn.
Kevin Reid

Bạn cũng có thể sử dụng một mảng kết cấu để tránh chi phí chuyển đổi.
danijar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.