Các mức mipmap được tính toán trong Metal như thế nào?


14

Câu hỏi của tôi đặc biệt liên quan đến Metal, vì tôi không biết câu trả lời có thay đổi cho API khác không.

Những gì tôi tin rằng tôi hiểu cho đến nay là:

  • Một kết cấu mipmaps đã tính toán trước "mức độ chi tiết", trong đó mức độ chi tiết thấp hơn được tạo ra bằng cách lấy mẫu kết cấu ban đầu theo một cách có ý nghĩa.

  • Các mức Mipmap được đề cập ở mức độ chi tiết giảm dần, trong đó mức độ 0là kết cấu ban đầu và các mức cao hơn là mức giảm sức mạnh của hai mức giảm.

  • Hầu hết các GPU đều thực hiện lọc trilinear, chọn hai mức mipmap lân cận cho từng mẫu, lấy mẫu từ mỗi cấp bằng cách sử dụng bộ lọc song tuyến, sau đó trộn tuyến tính các mẫu đó.

Điều tôi không hiểu lắm là làm thế nào các mức mipmap này được chọn. Trong tài liệu về thư viện tiêu chuẩn Metal, tôi thấy rằng các mẫu có thể được lấy, có hoặc không chỉ định một thể hiện của một lod_optionsloại. Tôi sẽ giả định rằng đối số này thay đổi cách các mức mipmap được chọn và rõ ràng có ba loại lod_optionscho kết cấu 2D:

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

Thật không may, tài liệu không bận tâm giải thích những gì trong số các tùy chọn này làm. Tôi có thể đoán rằng bias()sự thiên vị một số mức độ chi tiết được chọn tự động, nhưng sau đó sự thiên vị valuecó nghĩa là gì? Nó hoạt động trên quy mô nào? Tương tự như vậy, như thế nào là lodcủa level()dịch sang mức mipmap rời rạc? Và, hoạt động theo giả định gradient2d()sử dụng gradient của tọa độ kết cấu, làm thế nào để sử dụng gradient đó để chọn mức mipmap?

Quan trọng hơn, nếu tôi bỏ qua lod_options, các mức mipmap được chọn như thế nào? Điều này khác nhau tùy thuộc vào loại chức năng được thực hiện?

Và, nếu hoạt động không có tùy chọn mặc định của sample()chức năng là thực hiện một cái gì đó như gradient2D()(ít nhất là trong một shader mảnh), thì nó có sử dụng các dẫn xuất không gian màn hình đơn giản hay nó hoạt động trực tiếp với rasterizer và tọa độ kết cấu nội suy để tính toán một độ dốc chính xác?

Và cuối cùng, làm thế nào nhất quán bất kỳ hành vi này từ thiết bị đến thiết bị? Một bài viết cũ (cũ như trong DirectX 9) Tôi đã đọc đề cập đến lựa chọn mipmap dành riêng cho thiết bị phức tạp, nhưng tôi không biết liệu lựa chọn mipmap có được xác định rõ hơn trên các kiến ​​trúc mới hơn không.

Câu trả lời:


17

Lựa chọn Mip được tiêu chuẩn hóa khá tốt trên các thiết bị hiện nay, ngoại trừ một số chi tiết khó chịu về lọc bất đẳng hướng, vẫn tùy thuộc vào các nhà sản xuất GPU riêng lẻ (và các chi tiết chính xác của nó thường không được ghi lại công khai).

Một nơi tốt để đọc về lựa chọn mip một cách chi tiết là trong thông số OpenGL, phần 8.14, "Giảm thiểu kết cấu" . Tôi cho rằng nó hoạt động theo cách tương tự trong Metal. (Apple có thể đã thay đổi một cái gì đó, xem xét họ tạo ra cả phần cứng và API ... nhưng tôi nghi ngờ họ có.) Tôi sẽ tóm tắt ở đây.

Lựa chọn mip mặc định (không sử dụng bất kỳ công cụ lod_optionssửa đổi nào) sử dụng độ dốc không gian màn hình của tọa độ kết cấu để chọn các mức mip. Về cơ bản, nó cố gắng chọn các mức mip tạo ra càng gần càng tốt với ánh xạ 1: 1 của texels thành pixel. Ví dụ: nếu độ dốc có độ dài 4 tex mỗi pixel, nó sẽ chọn mip cấp 2 (bằng 1/4 kích thước của cấp 0 và do đó cung cấp cho bạn 1 texip mỗi pixel).

Với tính năng lọc trilinear, vì bạn thường không đạt được ánh xạ 1: 1 chính xác , nó chọn hai mức gần nhất và nội suy tuyến tính giữa chúng, để bạn có sự chuyển tiếp mượt mà giữa các mức mip khi máy ảnh hoặc các đối tượng trong cảnh của bạn di chuyển xung quanh.

λλλλ= =2,8

λđăng nhập2(1/4)= =-2

Bây giờ, đối với các tùy chọn sửa đổi:

  • biasλ
  • levelλλlod
  • gradient2dcho phép bạn đặt các vectơ gradient của riêng bạn, thay thế cho các gradient không gian màn hình ẩn của tọa độ kết cấu. Phần còn lại của quá trình chọn và lấy mẫu mip tiến hành như bình thường, nhưng với độ dốc thay đổi. Điều này cho phép bạn tùy chỉnh lọc bất đẳng hướng.

Trong các loại shader khác ngoài shader mảnh, không có khái niệm "độ dốc không gian màn hình", do đó, hai thao tác sau thường là những thao tác duy nhất cho phép bất kỳ thao tác nào cố gắng sử dụng gradient ẩn sẽ gây ra lỗi biên dịch. Tôi không tích cực, đó là cách Metal làm điều đó, nhưng đó là những gì tôi mong đợi khi làm việc với các API khác.

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.