Dựa trên mã shader mà bạn đã đăng, bạn không nội suy các tia cực tím từ các đỉnh - thay vào đó, có vẻ như bạn đang nội suy vị trí 3D ( fragVert
), sau đó tính toán các tia UV bằng cách chuyển đổi sang tọa độ hình cầu.
Phân tích của bạn là chính xác ở chỗ mipmap nhỏ nhất được chọn khi có sự gián đoạn, vì lựa chọn mipmap dựa trên các dẫn xuất được ước tính bằng số từ các UV được sử dụng trong các pixel lân cận. Khi một pixel có u = 0 và một pixel khác có u = 1, bạn nhận được một đạo hàm rất lớn. Khắc phục sự cố của bạn có cùng một vấn đề trong đó các dẫn xuất lớn xảy ra xung quanh u = 0,01 và u = 0,99, đó là lý do tại sao hai đường nối xuất hiện ở hai bên của đường may ban đầu.
Một cách tiếp cận tương đối đơn giản để khắc phục vấn đề sẽ là quyết định mức độ sử dụng mip nào và gọi textureLod
trực tiếp để lấy mẫu. Nếu hành tinh này luôn ở khá gần máy ảnh, bạn chỉ có thể mã hóa mức mip thành 0 (hoặc, đối với vấn đề đó, chỉ không bao gồm các mức mip trong kết cấu). Mặt khác, nó có thể dựa trên log2 của khoảng cách điểm từ máy ảnh, được thu nhỏ bởi một số yếu tố phù hợp. Lưu ý rằng điều này sẽ vô hiệu hóa hiệu quả lọc bất đẳng hướng.
Một cách tiếp cận "đúng" hơn sẽ là tính toán một số dẫn xuất chất lượng cao hơn. Thay vì sử dụng dFdx
và dFdy
trên UVs, mà có sự gián đoạn do atan2
, bạn có thể áp dụng dFdx
và dFdy
để fragVert
(mà sẽ liên tục tất cả các con đường xung quanh lĩnh vực), sau đó sử dụng một số giải tích (quy tắc chuỗi) để tìm công thức để có được những dẫn xuất UV từ các đạo hàm vị trí. Điều này sẽ phức tạp hơn và chậm hơn, nhưng có lợi thế là lọc bất đẳng hướng nên hoạt động.
Cuối cùng, vì bạn chưa quen với OpenGL, tôi sẽ chỉ lưu ý rằng trong khi tính toán UV từ tọa độ hình cầu là một cách hoàn toàn hợp lệ để kết cấu một hình cầu, đó không phải là cách "thông thường" mà hầu hết mọi người chọn. Việc xây dựng một lưới hình cầu có các tia UV được chỉ định cho mỗi đỉnh là điều phổ biến hơn và chỉ đơn giản được truyền từ trình tạo bóng đỉnh tới trình đổ bóng pixel (được nội suy tuyến tính trên mỗi tam giác). Các đỉnh được đặt dọc theo đường may, như thế này , sao cho có hai bản sao của mỗi đỉnh, ở cùng một vị trí, nhưng một nửa có u = 0 được nối với các tam giác ở một bên và nửa còn lại có u = 1 được kết nối với các hình tam giác ở phía bên kia. Điều này giúp loại bỏ bất kỳ đường may có thể nhìn thấy và không yêu cầu bất kỳ thủ thuật nào trong trình đổ bóng pixel.