Vấn đề với việc sử dụng các bản đồ kết cấu và rò rỉ texels liền kề có liên quan đến cách thức lọc kết cấu tuyến tính hoạt động.
Đối với bất kỳ điểm nào trong kết cấu không được lấy mẫu chính xác ở trung tâm của texel, lấy mẫu tuyến tính sẽ lấy mẫu 4 tex liền kề và tính giá trị tại vị trí bạn đã hỏi theo trọng số (dựa trên khoảng cách từ điểm mẫu) trung bình của cả 4 mẫu.
Đây là một hình dung tốt đẹp của vấn đề:
Vì bạn không thể sử dụng một cái gì đó giống như GL_CLAMP_TO_EDGE
trong tập bản đồ kết cấu, bạn cần tạo các đường viền quanh viền của mỗi họa tiết. Các texels đường viền này sẽ ngăn các mẫu lân cận từ các kết cấu hoàn toàn khác nhau trong tập bản đồ thay đổi hình ảnh thông qua phép nội suy có trọng số được giải thích ở trên.
Lưu ý rằng khi bạn sử dụng lọc bất đẳng hướng, bạn có thể cần tăng chiều rộng của đường viền. Điều này là do lọc bất đẳng hướng sẽ làm tăng kích thước của vùng lân cận mẫu ở các góc cực.
Để minh họa ý tôi muốn nói bằng cách sử dụng đường viền xung quanh mép của mỗi họa tiết, hãy xem xét các chế độ bao bọc khác nhau có sẵn trong OpenGL. Đặc biệt chú ý đến CLAMP TO EDGE
.
Mặc dù có một chế độ gọi là "Kẹp vào viền", nhưng đó thực sự không phải là điều chúng tôi quan tâm. Chế độ đó cho phép bạn xác định một màu duy nhất để sử dụng làm đường viền xung quanh kết cấu của bạn cho bất kỳ tọa độ kết cấu nào nằm ngoài chuẩn hóa [0,0 -1.0] phạm vi.
Những gì chúng tôi muốn là sao chép hành vi của CLAMP_TO_EDGE
, trong đó bất kỳ kết cấu nào nằm ngoài phạm vi thích hợp cho kết cấu (phụ) nhận giá trị của trung tâm texel cuối cùng theo hướng nằm ngoài giới hạn. Vì bạn gần như hoàn toàn kiểm soát tọa độ kết cấu trong một hệ thống bản đồ, kịch bản duy nhất trong đó tọa độ kết cấu (hiệu quả) có thể đề cập đến một vị trí bên ngoài kết cấu của bạn trong bước lọc trung bình có trọng số.
Chúng tôi biết rằng GL_LINEAR
sẽ lấy mẫu 4 hàng xóm gần nhất như đã thấy trong sơ đồ trên, vì vậy chúng tôi chỉ cần đường viền 1-texel. Bạn có thể cần một đường viền texel rộng hơn nếu bạn sử dụng bộ lọc bất đẳng hướng, bởi vì nó làm tăng kích thước vùng lân cận mẫu trong các điều kiện nhất định.
Dưới đây là một ví dụ về kết cấu minh họa đường viền rõ ràng hơn, mặc dù với mục đích của bạn, bạn có thể làm cho đường viền rộng 1 texel hoặc 2 texels.
(LƯU Ý: Đường viền tôi đang đề cập không phải là màu đen xung quanh tất cả bốn cạnh của hình ảnh, mà là khu vực nơi mẫu hình bàn cờ dừng lặp lại thường xuyên)
Trong trường hợp bạn đang tự hỏi, đây là lý do tại sao tôi tiếp tục đưa ra bộ lọc bất đẳng hướng. Nó thay đổi hình dạng của vùng lân cận mẫu dựa trên góc và có thể khiến hơn 4 texels được sử dụng để lọc:
http: //www.arcsyntribution.org/gltut/Texturing/ParallelogramDiag.svg
Mức độ bất đẳng hướng bạn sử dụng càng lớn, bạn càng có nhiều khả năng phải đối phó với các vùng lân cận mẫu có chứa hơn 4 texels. Đường viền 2 texel phải phù hợp với hầu hết các tình huống lọc bất đẳng hướng.
Cuối cùng nhưng không kém phần quan trọng, đây là cách một tập bản đồ kết cấu được đóng gói sẽ tái tạo GL_CLAMP_TO_EDGE
hành vi với sự có mặt của GL_LINEAR
bộ lọc kết cấu:
( Trừ 1 từ X và Y ở tọa độ màu đen, tôi không chứng minh đã đọc hình ảnh trước khi đăng. )
Do lưu trữ đường viền, lưu trữ 4 kết cấu 256x256 trong tập bản đồ này yêu cầu kết cấu có kích thước 516x516. Các đường viền được mã hóa màu dựa trên cách bạn sẽ điền chúng với dữ liệu texel trong quá trình tạo bản đồ:
- Đỏ = Thay thế bằng texel ngay bên dưới
- Vàng = Thay thế bằng texel trực tiếp ở trên
- Màu xanh lá cây = Thay thế bằng texel trực tiếp bên trái
- Blue = Thay thế bằng texel trực tiếp bên phải
Thực tế trong ví dụ được đóng gói này, mỗi kết cấu trong tập bản đồ sử dụng vùng 258x258 của tập bản đồ, nhưng bạn sẽ tạo tọa độ kết cấu ánh xạ tới vùng 256x256 có thể nhìn thấy. Các texels giáp chỉ được sử dụng khi lọc kết cấu được thực hiện ở các cạnh của kết cấu trong tập bản đồ, và cách chúng được thiết kế bắt chước GL_CLAMP_TO_EDGE
hành vi.
Trong trường hợp bạn đang tự hỏi, bạn có thể thực hiện các loại chế độ quấn khác bằng cách sử dụng một cách tiếp cận tương tự - GL_REPEAT
có thể được thực hiện bằng cách trao đổi các texels biên trái / phải và trên / dưới trong tập bản đồ kết cấu và một chút toán học phối hợp kết cấu thông minh trong một đổ bóng. Điều đó phức tạp hơn một chút, vì vậy bây giờ đừng lo lắng về điều đó. Vì bạn chỉ làm việc với các tấm sprite giới hạn bản thân mình GL_CLAMP_TO_EDGE
:)
GL_NEAREST
hoặcGL_LINEAR
để kết xuất các kết cấu?