Как анизотропная фильтрация обычно реализуется в современных графических процессорах?

14

Анизотропная фильтрация «сохраняет резкость текстуры, которая обычно теряется при попытках текстуры карты MIP избежать наложения». Статья в Википедии дает подсказки о том, как ее можно реализовать («исследовать текстуру (...) для любой ориентации анизотропии»), но она мне не очень понятна.

Кажется, что существуют различные реализации, как было предложено в тестах, показанных в примечаниях к презентации. Приблизительные модели для физического рендеринга : введите описание изображения здесь

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

WIP
источник
3
Спецификация для GL_EXT_texture_filter_anisotropicочень подробно. Может быть, это поможет вам лучше понять процесс.
Глэмперт

Ответы:

14

Аппаратное обеспечение фильтрации текстуры берет несколько выборок различных уровней mipmap (максимальное количество выборок указывается уровнем анизотропной фильтрации, хотя точное количество выборок, взятых в данной операции фильтрации, будет зависеть от соотношения между производными на фрагменте. ) Если вы проецируете конус, рассматривая поверхность под наклонным углом к ​​текстурному пространству, это приведет к приблизительно овальной проекции, которая более вытянута для более наклонных углов. Дополнительные образцы берутся вдоль оси этого овала (с правильных уровней mip, чтобы воспользоваться преимуществами предварительной фильтрации, которую они предлагают) и объединяют, чтобы получить более четкий образец текстуры.

Другая техника, известная как Rip- Mapping (упоминается в статье Википедии о Mipmapping), которая не являетсяобычно встречается в современных графических процессорах, использует предварительную фильтрацию текстур. В отличие от мипов, текстура не уменьшается равномерно, а использует разные соотношения высоты и ширины (до соотношения, зависящего от выбранного вами уровня анизотропной фильтрации). Вариант - или, может быть, два варианта при использовании трилинейной фильтрации - текстуры затем выбирается на основе угла поверхности, чтобы минимизировать искажения. Значения пикселей выбираются с использованием методов фильтрации по умолчанию (билинейный или трилинейный). Rip-карты не используются ни на одном из известных мне аппаратных средств из-за их запредельного размера: в то время как mip-карты используют дополнительное хранилище на 33%, rip-карты используют 300%. Это можно проверить, отметив, что требования к использованию текстуры не увеличиваются при использовании AF, а только пропускная способность.

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

yuriks
источник
5
Карты RIP также, вероятно, не используются, потому что они не помогают в довольно распространенном диагональном случае. FWIW, если вы можете найти код для Microsoft Refrast, реализация анистропного фильтра в этом, вероятно, является хорошим справочным материалом о том, как это делает сегодняшнее HW.
Саймон Ф
1
«Это можно проверить, отметив, что требования к использованию текстур не увеличиваются при использовании AF, а только пропускная способность». Убийственный аргумент. Хороший ответ!
Дэвид Кури
Ссылка «Высокопроизводительная растеризация программного обеспечения на графических процессорах» упоминает только анизотропную фильтрацию при прохождении один раз и не упоминает никаких подробностей. Поэтому я собираюсь отредактировать его из ответа, потому что я не думаю, что это полезно в полезной форме.
Юрикс
@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 
ap_
источник