Як анізотропна фільтрація зазвичай реалізується в сучасних графічних процесорах?


14

Анізотропна фільтрація "зберігає чіткість текстури, яка зазвичай втрачається внаслідок спроб текстури карти MIP уникнути згладжування". Стаття у Вікіпедії дає підказки про те, як це можна реалізувати ("зондуйте текстуру (...) для будь-якої орієнтації анізотропії"), але вона не дуже чітка для мене.

Там , як видається, різні реалізації, як це було запропоновано в ході випробувань , показаних в примітках презентаційних Приблизних Моделей Фізично рендеринг : введіть тут опис зображення

Які конкретні обчислення виконуються (сучасними) графічними процесорами для вибору правильного рівня MIP при використанні анізотропної фільтрації?


3
Специфікація GL_EXT_texture_filter_anisotropicдуже детальна. Можливо, це може допомогти вам краще зрозуміти процес.
glampert

Відповіді:


14

Обладнання для фільтрування текстури бере кілька зразків різних рівнів міпмапи (максимальна кількість зразків позначається рівнем анізотропної фільтрації, хоча точна кількість зразків, взятих у даній операції фільтрації, залежатиме від пропорції між похідними на фрагменті. ) Якщо проеціювати конус, розглядаючи поверхню під косим кутом на простір текстури, це призведе до приблизно проекції овальної форми, яка більш витягнута для більш косих кутів. Додаткові зразки беруть уздовж осі цього овалу (з правильних рівнів міп, щоб скористатися запропонованою попередньою фільтруванням) і об'єднують, щоб отримати більш чітку текстурну пробу.

Інша методика, як рип-картування (згадується у статті Вікіпедії про Mipmapping), що не єзазвичай зустрічається в сучасних графічних процесорах, використовує попередню фільтрацію текстур. На відміну від мип, текстуру не зменшують рівномірно, але використовують різні співвідношення висоти та ширини (до співвідношення залежно від обраного рівня анізотропної фільтрації). Потім варіант - або, можливо, два варіанти, якщо використовується трилінійна фільтрація - текстури вибирається виходячи з кута поверхні, щоб мінімізувати викривлення. Значення пікселів вибираються за допомогою методів фільтрації за замовчуванням (білінеарний або трилінійний). Rip-карти не використовуються в жодному апараті, про який я знаю, через їх непомірний розмір: в той час як mipmaps використовують додаткове 33% сховище, рип-карти використовують 300%. Це можна перевірити, зазначивши, що вимоги до використання текстури не збільшуються при використанні автофокусу, скоріше, лише пропускна здатність.

Для подальшого читання, ви можете ознайомитись із специфікацією для розширення EXT_texture_filter_anisotropic OpenGL. У ньому детально описані формули, які використовуються для обчислення зразків, та способи їх поєднання при використанні анізотропної фільтрації.


5
Карти RIP також, ймовірно, не використовуються, оскільки вони не допомагають у досить поширеному діагональному випадку. FWIW, якщо ви можете знайти код для Microsoft Refrast, реалізація аністропічного фільтра - це, мабуть, хороша орієнтація на те, як це робить сьогоднішня HW.
Simon F

1
"Це можна перевірити, зазначивши, що вимоги до використання текстури не збільшуються при використанні автофокусу, а лише пропускна здатність." Вбивчий аргумент. Гарна відповідь!
Девід Курі

Посилання "Раціоналізація програмного забезпечення високої продуктивності на графічних процесорах" лише один раз згадує про анізотропну фільтрацію і жодних деталей не згадує. Тож я збираюся відредагувати це з відповіді, тому що я не думаю, що це корисно у корисному вигляді.
Юрікс

@SimonF також можемо додати, що додаткова вимога пропускної здатності є досить страшною.
v.oddou

9

Вимоги API можна знайти в будь-якій специфікації або розширенні. Ось один: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

Усі постачальники графічних процесорів, ймовірно, відхиляються від специфікацій, оскільки якість AF була частиною багатьох орієнтирів. І поточні впровадження продовжуватимуть розвиватися, оскільки нові робочі навантаження підкреслюють існуючі наближення. На жаль, щоб точно знати, що робить, потрібно буде бути частиною однієї з компаній. Але ви можете оцінити спектр можливостей з наступних робіт, перелічених у порядку зростання якості та вартості впровадження:

Цитуючи з специфікації:

 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 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.