Làm thế nào để lọc bất đẳng hướng thường được thực hiện trong các GPU hiện đại?


14

Lọc bất đẳng hướng "giữ lại độ sắc nét của một kết cấu thường bị mất bởi các nỗ lực của kết cấu bản đồ MIP để tránh răng cưa". Bài viết Wikipedia đưa ra gợi ý về cách nó có thể được thực hiện ("thăm dò kết cấu (...) cho bất kỳ định hướng bất đẳng hướng"), nhưng nó không đọc được rõ ràng cho tôi.

Dường như có nhiều cách triển khai khác nhau, như được đề xuất bởi các thử nghiệm được minh họa trong các ghi chú của bài thuyết trình Mô hình gần đúng để kết xuất dựa trên vật lý : nhập mô tả hình ảnh ở đây

Các tính toán cụ thể được thực hiện bởi GPU (hiện đại) để chọn mức MIP chính xác khi sử dụng bộ lọc bất đẳng hướng là gì?


3
Thông số kỹ thuật GL_EXT_texture_filter_anisotropicrất chi tiết. Có lẽ nó có thể giúp bạn hiểu rõ hơn về quy trình.
glampert

Câu trả lời:


14

Phần cứng lọc kết cấu lấy một số mẫu của các mức mipmap khác nhau (lượng mẫu tối đa được biểu thị bằng mức lọc bất đẳng hướng, mặc dù lượng mẫu chính xác được lấy trong một hoạt động lọc nhất định sẽ phụ thuộc vào tỷ lệ giữa các dẫn xuất trên đoạn. ) Nếu bạn chiếu hình nón xem một bề mặt ở góc xiên vào không gian kết cấu, nó sẽ dẫn đến hình chiếu xấp xỉ hình bầu dục, được kéo dài hơn cho các góc xiên hơn. Các mẫu bổ sung được lấy dọc theo trục của hình bầu dục này (từ các mức mip chính xác, để tận dụng lợi thế của bộ lọc trước mà chúng cung cấp) và kết hợp để tạo ra một mẫu kết cấu sắc nét hơn.

Một kỹ thuật khác được gọi là rip-maps (được đề cập trong bài viết trên Wikipedia về Mipmapping), không phải là kỹ thuậtthường được tìm thấy trong các GPU hiện đại, sử dụng tiền xử lý kết cấu. Ngược lại với mips, kết cấu không được thu nhỏ lại một cách đồng đều mà sử dụng các tỷ lệ chiều rộng chiều rộng khác nhau (lên đến tỷ lệ phụ thuộc vào mức lọc bất đẳng hướng đã chọn của bạn). Biến thể - hoặc có thể là hai biến thể nếu sử dụng bộ lọc trilinear - của kết cấu sau đó được chọn dựa trên góc của bề mặt để giảm thiểu biến dạng. Các giá trị pixel được tìm nạp bằng các kỹ thuật lọc mặc định (song tuyến hoặc tam tuyến). Rip-maps không được sử dụng trong bất kỳ phần cứng nào mà tôi biết do kích thước cấm của chúng: trong khi mipmap sử dụng thêm 33% lưu trữ, ripmap sử dụng 300%. Điều này có thể được xác minh bằng cách lưu ý rằng các yêu cầu sử dụng kết cấu không tăng khi sử dụng AF, thay vào đó, chỉ có băng thông.

Để đọc thêm, bạn có thể muốn xem thông số kỹ thuật cho tiện ích mở rộng OpenGL EXT nhiệture_filter_anisotropic . Nó chi tiết các công thức được sử dụng để tính toán các mẫu và cách kết hợp chúng khi sử dụng lọc bất đẳng hướng.


5
Bản đồ RIP có lẽ cũng không được sử dụng vì chúng không giúp ích cho trường hợp đường chéo, khá phổ biến. FWIW, nếu bạn có thể tìm thấy mã cho Microsoft RDast, thì việc triển khai bộ lọc không đối xứng trong đó có lẽ là một tài liệu tham khảo tốt cho cách mà CTNH ngày nay thực hiện.
Simon F

1
"Điều này có thể được xác minh bằng cách lưu ý rằng các yêu cầu sử dụng kết cấu không tăng khi sử dụng AF, thay vào đó, chỉ có băng thông." Kẻ giết người tranh luận. Câu trả lời tốt!
David Kuri

Liên kết "Rasterization phần mềm hiệu suất cao trên GPU" chỉ đề cập đến việc lọc bất đẳng hướng khi truyền một lần và không đề cập đến bất kỳ chi tiết nào. Vì vậy, tôi sẽ chỉnh sửa nó ra khỏi câu trả lời vì tôi không nghĩ nó có liên quan theo cách hữu ích.
yuriks

@SimonF chúng ta cũng có thể thêm rằng yêu cầu băng thông bổ sung là khá đáng sợ.
v.oddou

9

Các yêu cầu API có thể được tìm thấy trong bất kỳ thông số kỹ thuật hoặc tiện ích mở rộng nào. Đây là một: https://www.opengl.org/regology/specs/EXT/texture_filter_anisotropic.txt

Tất cả các nhà cung cấp GPU có thể đi chệch khỏi thông số kỹ thuật vì chất lượng AF từng là một phần của nhiều điểm chuẩn. Và các triển khai hiện tại sẽ tiếp tục phát triển khi khối lượng công việc mới nhấn mạnh đến các xấp xỉ hiện có. Thật không may, để biết chính xác những gì làm, bạn sẽ cần phải là một phần của một trong các công ty. Nhưng bạn có thể đánh giá phổ các khả năng từ các giấy tờ sau, được liệt kê theo thứ tự tăng dần về chất lượng và chi phí thực hiện:

Trích dẫn từ thông số kỹ thuật:

 Anisotropic texture filtering substantially changes Section 3.8.5.
 Previously a single scale factor P was determined based on the
 pixel's projection into texture space.  Now two scale factors,
 Px and Py, are computed.

   Px = sqrt(dudx^2 + dvdx^2)
   Py = sqrt(dudy^2 + dvdy^2)

   Pmax = max(Px,Py)
   Pmin = min(Px,Py)

   N = min(ceil(Pmax/Pmin),maxAniso)
   Lamda' = log2(Pmax/N)

 where maxAniso is the smaller of the texture's value of
 TEXTURE_MAX_ANISOTROPY_EXT or the implementation-defined value of
 MAX_TEXTURE_MAX_ANISOTROPY_EXT.

 It is acceptable for implementation to round 'N' up to the nearest
 supported sampling rate.  For example an implementation may only
 support power-of-two sampling rates.

 It is also acceptable for an implementation to approximate the ideal
 functions Px and Py with functions Fx and Fy subject to the following
 conditions:

   1.  Fx is continuous and monotonically increasing in |du/dx| and |dv/dx|.
       Fy is continuous and monotonically increasing in |du/dy| and |dv/dy|.

   2.  max(|du/dx|,|dv/dx|} <= Fx <= |du/dx| + |dv/dx|.
       max(|du/dy|,|dv/dy|} <= Fy <= |du/dy| + |dv/dy|.

 Instead of a single sample, Tau, at (u,v,Lamda), 'N' locations in the mipmap
 at LOD Lamda, are sampled within the texture footprint of the pixel.

 Instead of a single sample, Tau, at (u,v,lambda), 'N' locations in
 the mipmap at LOD Lamda are sampled within the texture footprint of
 the pixel.  This sum TauAniso is defined using the single sample Tau.
 When the texture's value of TEXTURE_MAX_ANISOTROPHY_EXT is greater
 than 1.0, use TauAniso instead of Tau to determine the fragment's
 texture value.

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x - 1/2 + i/(N+1), y), v(x - 1/2 + i/(N+1), y)),  Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x, y - 1/2 + i/(N+1)), v(x, y - 1/2 + i/(N+1))),  Py >= Px
                /
                ---
                i=1


 It is acceptable to approximate the u and v functions with equally spaced
 samples in texture space at LOD Lamda:

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudx(i/(N+1)-1/2), v(x,y)+dvdx(i/(N+1)-1/2)), Px > Py
                /
                ---
                i=1

                i=N
                ---
 TauAniso = 1/N \ Tau(u(x,y)+dudy(i/(N+1)-1/2), v(x,y)+dvdy(i/(N+1)-1/2)), Py >= Px
                /
                ---
                i=1 
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.