Giúp tôi nắm bắt Lọc bất đẳng hướng (AF)


8

Gần đây tôi đã đọc về lọc kết cấu, cụ thể là lọc Hàng xóm gần nhất, Lọc nhị phân, Lọc Trilinear, Lọc bất đẳng hướng, Bản đồ MIP, Bản đồ RIP, v.v.

Từ góc độ cấp cao, tôi nghĩ rằng tôi có thể hiểu các kỹ thuật này, cách thức hoạt động và lý do chúng tồn tại, ngoại trừ lọc bất đẳng hướng. Lọc bất đẳng hướng đang thúc đẩy tôi.

Tôi có thể thấy vấn đề phải kết cấu bề mặt ở một góc so với máy ảnh, nhưng tôi không hiểu làm thế nào lấy mẫu dấu chân hình thang có thể giải quyết điều này (mặc dù tôi có thể thấy kết quả). Điều này có lẽ là do tôi KHÔNG hiểu cách tính dấu chân hình thang và cách thức các telex kèm theo được cân để lấy mẫu kết cấu.

Bài viết này của Nvidia làm tôi bối rối hơn nữa khi sử dụng các câu như " khi một texel là hình thang " hoặc " lọc bất đẳng hướng tỷ lệ chiều cao hoặc chiều rộng của mipmap theo tỷ lệ so với biến dạng phối cảnh của kết cấu ". Hình thang texel? Thu nhỏ một MIPmap? Điều này thậm chí còn có ý nghĩa gì?

Bạn có thể giúp tôi nắm bắt cách thức hoạt động của các mức AF và AF không?

Xin lưu ý rằng mục tiêu của tôi KHÔNG phải là triển khai OpenGL hoặc DirectX AF, mà là để nắm bắt cách AF hoạt động từ góc độ cấp cao.

Câu trả lời:


10

Để hiểu bản chất của lọc bất đẳng hướng, bạn cần có một sự hiểu biết vững chắc về ý nghĩa của ánh xạ kết cấu.

Thuật ngữ "ánh xạ kết cấu" có nghĩa là gán các vị trí trên một đối tượng cho các vị trí trong một kết cấu. Điều này cho phép rasterizer / shader, đối với từng vị trí trên đối tượng, lấy dữ liệu tương ứng từ kết cấu. Phương pháp truyền thống để thực hiện điều này là gán cho mỗi đỉnh trên một đối tượng tọa độ kết cấu, trực tiếp ánh xạ vị trí đó đến một vị trí trong kết cấu. Trình rasterizer sẽ nội suy tọa độ kết cấu này trên các mặt của các hình tam giác khác nhau để tạo ra tọa độ kết cấu được sử dụng để lấy màu từ kết cấu.

Bây giờ, hãy nghĩ về quá trình rasterization. Làm thế nào mà làm việc? Nó lấy một hình tam giác và chia nó thành các khối có kích thước pixel mà chúng ta sẽ gọi là "các mảnh". Bây giờ, các khối có kích thước pixel này có kích thước pixel so với màn hình.

Nhưng những mảnh này không có kích thước pixel so với kết cấu. Hãy tưởng tượng nếu rasterizer của chúng tôi tạo ra một tọa độ kết cấu cho mỗi góc của mảnh. Bây giờ hãy tưởng tượng vẽ 4 góc đó, không phải trong không gian màn hình, mà trong không gian kết cấu . Hình dạng này sẽ là gì?

Vâng, điều đó phụ thuộc vào tọa độ kết cấu. Đó là, nó phụ thuộc vào cách kết cấu được ánh xạ tới đa giác. Đối với bất kỳ mảnh cụ thể nào, nó có thể là một hình vuông thẳng hàng trục. Nó có thể là một hình vuông không thẳng hàng trục. Nó có thể là một hình chữ nhật. Nó có thể là một hình thang. Nó có thể là khá nhiều bất kỳ con số bốn mặt (hoặc ít nhất, những cái lồi).

Nếu bạn đang thực hiện truy cập kết cấu một cách chính xác, cách để có được màu kết cấu cho một đoạn sẽ là tìm ra hình chữ nhật này là gì. Sau đó tìm nạp mọi texel từ kết cấu trong hình chữ nhật đó (sử dụng vùng phủ sóng để chia tỷ lệ màu nằm trên đường viền). Sau đó, trung bình tất cả chúng cùng nhau. Đó sẽ là ánh xạ kết cấu hoàn hảo.

Nó cũng sẽ cực kỳ chậm .

Thay vào đó, chúng ta cố gắng ước chừng câu trả lời thực sự. Chúng tôi dựa trên mọi thứ trên một tọa độ kết cấu, thay vì 4 bao phủ toàn bộ khu vực của mảnh vỡ trong không gian texel.

Lọc dựa trên Mipmap sử dụng hình ảnh có độ phân giải thấp hơn. Những hình ảnh này về cơ bản là một lối tắt cho phương pháp hoàn hảo, bằng cách tính toán trước các khối màu lớn sẽ trông như thế nào khi được pha trộn với nhau. Vì vậy, khi nó chọn một mipmap thấp hơn, nó đang sử dụng các giá trị được tính toán trước trong đó mỗi texel đại diện cho một khu vực của kết cấu.

Lọc bất đẳng hướng hoạt động bằng cách xấp xỉ phương pháp hoàn hảo (có thể, và nên, được kết hợp với mipmapping) thông qua việc lấy đến một số lượng mẫu bổ sung cố định. Nhưng làm thế nào để tìm ra khu vực trong không gian texel để tìm nạp, vì nó vẫn chỉ được cung cấp một tọa độ kết cấu?

Về cơ bản, nó gian lận. Do các shader mảnh được thực thi trong các khối lân cận 2x2, nên có thể tính đạo hàm của bất kỳ giá trị nào trong shader mảnh trong không gian màn hình X và Y. Sau đó, nó sử dụng các dẫn xuất này, kết hợp với tọa độ kết cấu thực tế, để tính xấp xỉ những gì dấu chân kết cấu của mảnh thực sự sẽ là gì. Và sau đó nó thực hiện một số mẫu trong khu vực này.

Đây là một sơ đồ để giúp giải thích nó:

Dấu chân mảnh và mẫu dị hướng.  FYI: nếu bạn đã nhìn thấy nó trước đây, nó là của tôi.

Các hình vuông đen trắng đại diện cho kết cấu của chúng tôi. Nó chỉ là một bàn cờ gồm 2 x 2 màu trắng và đen.

Dấu chấm màu cam là tọa độ kết cấu cho đoạn trong câu hỏi. Đường viền màu đỏ là dấu chân của mảnh, được tập trung vào tọa độ kết cấu.

Các hộp màu xanh lá cây đại diện cho các texels mà việc triển khai lọc bất đẳng hướng có thể truy cập (chi tiết về thuật toán lọc bất đẳng hướng là cụ thể nền tảng, vì vậy tôi chỉ có thể giải thích ý tưởng chung).

Sơ đồ cụ thể này cho thấy việc triển khai có thể truy cập 4 texels. Ồ vâng, các hộp màu xanh lá cây bao gồm 7 trong số chúng, nhưng hộp màu xanh lá cây ở trung tâm có thể tìm nạp từ một mipmap nhỏ hơn, do đó lấy tương đương 4 texels trong một lần tìm nạp. Việc triển khai tất nhiên sẽ cân trung bình cho 4 lần tìm nạp đó so với các texel đơn.

Nếu giới hạn lọc bất đẳng hướng là 2 thay vì 4 (hoặc cao hơn), thì việc triển khai sẽ chọn 2 trong số các mẫu đó để thể hiện dấu chân của mảnh.


Cảm ơn bạn đã giải thích điều này và xin lỗi vì câu trả lời bị trì hoãn, nhưng tôi đã phải tìm thời gian để đọc nó rất cẩn thận. Tôi cảm thấy như đoạn duy nhất tôi không hoàn toàn hiểu là đoạn mà bạn nói về shader mảnh và dẫn xuất. Chính xác những gì có nguồn gốc trong không gian màn hình X và Y? Có phải là giá trị tọa độ kết cấu?
Nicola Masotti

@NicolaMasotti: " Đạo hàm" là một thuật ngữ tính toán. Trong trường hợp này, đó là tốc độ thay đổi của tọa độ kết cấu, trên bề mặt của tam giác, trong không gian màn hình X hoặc Y. Nếu bạn không biết tính toán, thì tôi sẽ không thể giải thích nó để bạn trong một bài viết duy nhất.
Nicol Bolas

May mắn thay tôi biết đạo hàm là gì. Có nơi nào tôi có thể nhìn vào toán chính xác không?
Nicola Masotti

Ngoài ra, tôi sẽ đề xuất một vài thay đổi cho câu trả lời của bạn, nghĩa là " nó phụ thuộc vào cách đa giác được ánh xạ tới kết cấu " thay vì " nó phụ thuộc vào cách kết cấu được ánh xạ tới đa giác ". Ngoài ra, khi bạn nói: " sử dụng vùng phủ sóng để chia tỷ lệ màu ở viền " bạn có thực sự có nghĩa là " màu trọng lượng nằm trên đường viền " không?
Nicola Masotti

3

Một vài điểm mà có lẽ bạn đã biết, nhưng tôi chỉ muốn đưa ra cho những người khác đọc nó. Lọc trong trường hợp này đề cập đến lọc thông thấp như bạn có thể nhận được từ Gaussian Blur hoặc làm mờ hộp. Chúng ta cần phải làm điều này bởi vì chúng ta đang sử dụng một số phương tiện có tần số cao trong đó và đưa nó vào một không gian nhỏ hơn. Nếu chúng tôi không lọc nó, chúng tôi sẽ nhận được các tạo tác răng cưa, trông sẽ tệ. Vì vậy, chúng tôi lọc các tần số quá cao để được sao chép chính xác trong phiên bản thu nhỏ. (Và chúng tôi vượt qua các tần số thấp, vì vậy chúng tôi sử dụng bộ lọc "thông thấp" như một vệt mờ.)

Vì vậy, hãy nghĩ về điều này đầu tiên từ quan điểm của một mờ. Một mờ là một loại tích chập. Chúng tôi lấy hạt nhân chập và nhân nó với tất cả các pixel trong một khu vực và sau đó cộng chúng lại với nhau và chia cho trọng số. Điều đó cho chúng ta đầu ra của một pixel. Sau đó, chúng tôi di chuyển nó và làm lại cho pixel tiếp theo, và một lần nữa, v.v.

Nó thực sự tốn kém để làm theo cách đó, vì vậy có một cách để gian lận. Một số hạt nhân chập (đặc biệt là nhân mờ Gaussian và nhân mờ hộp) có thể được tách thành một đường ngang và dọc. Trước tiên, bạn có thể lọc mọi thứ chỉ bằng một hạt nhân nằm ngang, sau đó lấy kết quả của nó và lọc nó chỉ bằng một hạt nhân dọc và kết quả sẽ giống hệt với việc thực hiện phép tính đắt hơn ở mọi điểm. Đây là một ví dụ:

Nguyên:

Hawaii

Làm mờ ngang:

Hawaii mờ theo chiều ngang

Theo chiều ngang theo chiều dọc:

Hawaii mờ theo chiều ngang và sau đó theo chiều dọc

Vì vậy, chúng ta có thể tách bộ lọc thành một đường chuyền dọc và ngang. Vậy thì sao? Chà, hóa ra chúng ta có thể làm điều tương tự cho các biến đổi không gian. Nếu bạn nghĩ về một vòng quay phối cảnh, như thế này:

Hawaii Xoay quanh trục Y

Nó có thể được chia thành thang điểm X:

nhập mô tả hình ảnh ở đây

theo sau là một tỷ lệ của mỗi cột bằng một lượng hơi khác nhau:

Hawaii chia tỷ lệ theo X và sau đó theo tỷ lệ Y

Vì vậy, bây giờ bạn có 2 hoạt động mở rộng quy mô khác nhau. Để lọc chính xác cho điều này, bạn sẽ muốn lọc nhiều hơn trong X so với Y và bạn sẽ muốn lọc theo một lượng khác nhau cho mỗi cột. Cột đầu tiên không được lọc vì nó có cùng kích thước với bản gốc. Cột thứ hai chỉ được một chút vì nó chỉ nhỏ hơn cột thứ nhất một chút, v.v ... Cột cuối cùng được lọc nhiều nhất trong bất kỳ cột nào.

Từ "bất đẳng hướng" xuất phát từ tiếng Hy Lạp "một" có nghĩa là "không", "isos" có nghĩa là bằng nhau, và "nhiệt đới" có nghĩa là "hướng". Vì vậy, nó có nghĩa là "không bằng nhau trong tất cả các hướng." Và đó chính xác là những gì chúng ta thấy - việc chia tỷ lệ và lọc được thực hiện với số lượng khác nhau theo mỗi hướng.

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.