Phối hợp gián đoạn kết cấu với mipmap tạo đường nối


9

Tôi mới bắt đầu học openGL và tôi nhận được tạo tác này khi kết cấu một hình cầu bằng mipmap. Về cơ bản khi đoạn đó lấy mẫu cạnh của kết cấu của tôi, nó sẽ phát hiện sự gián đoạn (nói từ 1 đến 0) và chọn mipmap nhỏ nhất, tạo ra đường may xấu xí này:

đường may xấu xí http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png

Vì vậy, tôi đã cố gắng ghi đè thủ công các gradient bằng textureGrad:

//fragVert is the original vertex from the vertex shader
vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5));
vec2 ll2 = ll;
if (ll.x < 0.01 || ll.x > 0.99)
    ll2.x = .5;
vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2));

Bây giờ tôi có hai đường nối thay vì một. Làm thế nào tôi có thể thoát khỏi chúng? Và tại sao đoạn mã trên tạo ra 2 đường nối?

2 eams http://cdn.imghack.se/images/44a38ef13cc2cdd801967c9223fdd2d3.png

Bạn không thể biết từ hai hình ảnh nhưng 2 đường nối nằm ở hai bên của đường may ban đầu.


2
Là hình cầu của bạn là một lưới, hoặc bạn đang raytracing hình cầu phân tích trong shader hoặc như vậy? Nếu đó là một lưới, mọi người thường giải quyết điều này bằng cách nhân đôi các đỉnh dọc theo đường may sao cho các câu ở một bên có thể có u = 0 và bên kia có u = 1.
Nathan Reed

Về lý do tại sao mã của bạn tạo ra hai đường nối, tôi hy vọng nó sẽ tạo ra hai điểm không liên tục - một trong đó bạn nhảy từ 0,01 đến 0,5 và một trong đó bạn nhảy từ 0,99 đến 0,5. Đó là vấn đề tương tự như khi bạn nhảy từ 0 lên 1 - không phải là một bước nhảy lớn nhưng vẫn là một bước nhảy lớn.
Nathan Reed

Tôi có một lưới cho hình cầu. Đó là một decahedron vì vậy các đỉnh không thẳng hàng với đường may. Điều buồn cười về hai đường may là đường may ban đầu đã biến mất. Ngoài ra, tôi có được 2 đường nối giống nhau ngay cả khi tôi kẹp nó thành 0,01 hoặc 0,99.
omikun

Bạn có thể đăng một ảnh chụp màn hình của trường hợp hai đường nối? Và, làm thế nào bạn tạo ra UV (bạn có thể đăng phần có liên quan của mã của bạn) không? Tôi cho rằng bạn đang tạo ra chúng theo cách thủ công trong shader, không chỉ nội suy chúng từ các đỉnh, nếu không, lưới dodecahedron của bạn sẽ không hoạt động.
Nathan Reed

Tôi đã cập nhật câu hỏi với hình ảnh của 2 đường may, chúng là một trong hai phía của đường may ban đầu, nhưng đường may ban đầu không có ở đó. Tôi nghĩ rằng tia cực tím được nội suy từ các đỉnh, không chắc chắn. Các mã là trong câu hỏi bây giờ.
omikun

Câu trả lời:


4

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 textureLodtrự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 dFdxdFdytrên UVs, mà có sự gián đoạn do atan2, bạn có thể áp dụng dFdxdFdyđể 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.

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.