Anizotropik filtreleme tipik olarak modern GPU'larda nasıl uygulanır?


14

Anizotropik filtreleme "normalde MIP harita dokusunun örtüşme önleme girişimleriyle kaybedilen bir dokunun keskinliğini korur". Wikipedia makalesi, nasıl uygulanabileceğine dair ipuçları veriyor ("herhangi bir anizotropi yönelimi için dokuyu araştır (...)"), ancak benim için çok net bir şekilde okunmuyor.

Sunumun notlarında gösterilen testlerin önerdiği gibi, çeşitli uygulamalar var gibi Fiziksel Tabanlı Oluşturma için Yaklaşık Modeller : resim açıklamasını buraya girin

Anizotropik filtreleme kullanırken doğru MIP seviyesini seçmek için (modern) GPU'lar tarafından yapılan somut hesaplamalar nelerdir?


3
İçin spec GL_EXT_texture_filter_anisotropicçok ayrıntılı. Belki de süreci daha iyi anlamanıza yardımcı olabilir.
glampert

Yanıtlar:


14

Doku filtreleme donanımı, çeşitli mipmap seviyelerinden birkaç numune alır (maksimum numune miktarı, anizotropik filtreleme seviyesi ile gösterilir, ancak belirli bir filtreleme işleminde alınan tam numune miktarı, fragman üzerindeki türevler arasındaki orana bağlı olacaktır. ) Koniyi bir yüzeyi eğik bir açıyla doku boşluğuna bakacak şekilde yansıtırsanız, yaklaşık oval şekilli bir çıkıntıya neden olur ve bu da daha eğik açılar için daha uzar. Bu oval ekseni boyunca (sundukları ön filtreden yararlanmak için doğru mip seviyelerinden) ekstra numuneler alınır ve daha keskin bir doku örneği vermek için birleştirilir.

Diğer bir teknik bilgi soygun haritalama olan (Mipmapping Vikipedi'ye belirtilen), değilçağdaş GPU'larda yaygın olarak bulunan, dokuların ön filtrelemesini kullanır. Miplerin aksine, doku eşit olarak ölçeklenmez, ancak çeşitli yükseklik-genişlik oranları kullanılır (seçtiğiniz anizotropik filtreleme seviyesine bağlı bir orana kadar). Dokunun üç boyutlu filtrelemesi kullanılıyorsa - ya da belki iki yönlü filtre kullanılıyorsa - distorsiyonu en aza indirmek için yüzeyin açısına göre seçilir. Piksel değerleri, varsayılan filtreleme teknikleri (çift doğrusal veya üç çizgili) kullanılarak getirilir. Rip-haritaları, engelleyici boyutları nedeniyle bildiğim herhangi bir donanımda kullanılmaz: mipmap'lar% 33 ek depolama alanı kullanırken, ripmap'lar% 300 kullanır. Bu, AF kullanılırken doku kullanım gereksinimlerinin artmadığına dikkat edilerek doğrulanabilir, bunun yerine yalnızca bant genişliği artar.

Daha ayrıntılı okumak için EXT_texture_filter_anisotropic OpenGL uzantısının teknik özelliklerine göz atmak isteyebilirsiniz . Örnekleri hesaplamak için kullanılan formülleri ve anizotropik filtreleme kullanırken bunların nasıl birleştirileceğini ayrıntılı olarak açıklar.


5
RIP haritaları da muhtemelen yaygın değildir, çünkü oldukça yaygın olan çapraz durumda yardımcı olmuyorlar. FWIW, Microsoft Refrast için kodu bulabilirseniz, içindeki anistropik filtre uygulaması, bugünün HW'sinin bunu nasıl yapacağına muhtemelen iyi bir referanstır.
Simon F

1
"Bu, AF kullanılırken doku kullanım gereksinimlerinin artmadığını belirterek doğrulanabilir, bunun yerine yalnızca bant genişliği artar." Katil argümanı. İyi cevap!
David Kuri

"GPU'larda Yüksek Performanslı Yazılım Rasterizasyonu" bağlantısı sadece bir kez geçişte anizotropik filtreden bahseder ve herhangi bir ayrıntıdan bahsetmez. Bu yüzden cevabın dışında düzenleyeceğim çünkü yararlı olduğunu düşünmüyorum.
yuriks

@SimonF ayrıca ek bant genişliği gereksiniminin oldukça korkutucu olduğunu da ekleyebiliriz.
v.oddou

9

API gereksinimleri özelliklerin veya uzantıların herhangi birinde bulunabilir. İşte bir tane: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

AF kalitesi eskiden birçok kriterin parçası olduğu için tüm GPU tedarikçileri büyük olasılıkla teknik özelliklerden sapıyor. Ve yeni iş yükleri mevcut yaklaşımları vurguladığı için mevcut uygulamalar gelişmeye devam edecektir. Ne yazık ki, her ikisinin de tam olarak ne yaptığını bilmek için şirketlerden birinin parçası olmanız gerekir. Ancak, artan kalite ve uygulama maliyeti sırasına göre listelenen aşağıdaki kağıtlardan olasılık yelpazesini ölçebilirsiniz:

Spec alıntılar:

 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 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.