โดยทั่วไปแล้วการกรองแบบแอนไอโซทรอปิกจะนำไปใช้กับ GPU สมัยใหม่ได้อย่างไร?


14

การกรอง Anisotropic "รักษาความคมชัดของพื้นผิวที่สูญเสียไปตามปกติโดยความพยายามในการหลีกเลี่ยงการใช้นามแฝงของพื้นผิวแผนที่ MIP" บทความ Wikipedia ให้คำแนะนำเกี่ยวกับวิธีการนำไปใช้ ("ตรวจสอบพื้นผิว (... ) สำหรับการวางแนวของ Anisotropy") แต่มันไม่ได้อ่านอย่างชัดเจนสำหรับฉัน

ดูเหมือนจะมีการใช้งานที่หลากหลายตามที่แนะนำโดยการทดสอบที่แสดงในบันทึกของงานนำเสนอแบบจำลองโดยประมาณสำหรับการแสดงผลตามร่างกาย : ป้อนคำอธิบายรูปภาพที่นี่

การคำนวณที่เป็นรูปธรรมดำเนินการโดย GPU (สมัยใหม่) ในการเลือกระดับ MIP ที่ถูกต้องเมื่อใช้ตัวกรอง anisotropic คืออะไร


3
สเป็คสำหรับGL_EXT_texture_filter_anisotropicมีรายละเอียดมาก อาจช่วยให้คุณเข้าใจกระบวนการได้ดีขึ้น
glampert

คำตอบ:


14

ฮาร์ดแวร์การกรองพื้นผิวใช้ตัวอย่างหลาย ๆ ระดับระดับมิปแมพ (จำนวนสูงสุดของตัวอย่างจะถูกระบุโดยระดับการกรองแบบแอนไอโซทรอปิกถึงแม้ว่าจำนวนตัวอย่างที่แน่นอนในการดำเนินการกรองที่กำหนดจะขึ้นอยู่กับสัดส่วนระหว่างอนุพันธ์บนชิ้นส่วน ) หากคุณฉายกรวยที่ดูพื้นผิวในมุมเอียงลงบนช่องว่างของพื้นผิวมันจะส่งผลให้การฉายภาพรูปวงรีโดยประมาณซึ่งยาวขึ้นสำหรับมุมเอียงมากขึ้น ตัวอย่างเพิ่มเติมจะถูกนำไปตามแนวแกนของวงรีนี้ (จากระดับ mip ที่ถูกต้องเพื่อใช้ประโยชน์จากการกรองล่วงหน้าที่เสนอ) และรวมกันเพื่อให้ตัวอย่างเนื้อสัมผัสที่คมชัดยิ่งขึ้น

อีกเทคนิคหนึ่งที่รู้จักกันในชื่อการทำแผนที่แบบริป (ที่กล่าวถึงในบทความ Wikipedia เกี่ยวกับการทำแผนที่ ) ซึ่งไม่ใช่พบได้ทั่วไปใน GPU ร่วมสมัยใช้พื้นผิวของการกรองล่วงหน้า ตรงกันข้ามกับ mips พื้นผิวไม่ได้ลดขนาดลงอย่างสม่ำเสมอ แต่ใช้อัตราส่วนความสูงความกว้างต่าง ๆ (สูงถึงอัตราส่วนขึ้นอยู่กับระดับการกรองแบบ anisotropic ที่คุณเลือก) ตัวแปร - หรืออาจจะสองรูปแบบหากใช้ตัวกรอง trilinear - ของพื้นผิวจะถูกเลือกตามมุมของพื้นผิวเพื่อลดการบิดเบือน ค่าพิกเซลถูกดึงมาโดยใช้เทคนิคการกรองเริ่มต้น (bilinear หรือ trilinear) Rip-maps ไม่ได้ใช้กับฮาร์ดแวร์ใด ๆ ที่ฉันรู้เนื่องจากขนาดต้องห้าม: ในขณะที่ mipmaps ใช้พื้นที่เก็บข้อมูลเพิ่ม 33% ส่วน ripmaps ใช้ 300% สิ่งนี้สามารถตรวจสอบได้โดยสังเกตว่าข้อกำหนดการใช้งานพื้นผิวจะไม่เพิ่มขึ้นเมื่อใช้ AF แต่จะใช้แบนด์วิดท์เท่านั้น

สำหรับการอ่านเพิ่มเติมคุณอาจต้องการดูสเปคสำหรับส่วนขยายEXT_texture_filter_anisotropic OpenGL มันมีรายละเอียดสูตรที่ใช้ในการคำนวณตัวอย่างและวิธีการรวมพวกเขาเมื่อใช้การกรอง anisotropic


5
แผนที่ RIP นั้นอาจไม่ได้ใช้เพราะมันไม่ได้ช่วยในกรณีที่เป็นแนวขวางค่อนข้างบ่อย FWIW หากคุณสามารถค้นหารหัสสำหรับ Microsoft Refrast การใช้ตัวกรอง anistropic ในนั้นอาจเป็นการอ้างอิงที่ดีสำหรับวิธีการ HW ของวันนี้
Simon F

1
"สิ่งนี้สามารถตรวจสอบได้โดยการสังเกตว่าข้อกำหนดการใช้งานพื้นผิวจะไม่เพิ่มขึ้นเมื่อใช้ AF แต่จะใช้แบนด์วิดท์เท่านั้น" อาร์กิวเมนต์นักฆ่า คำตอบที่ดี!
David Kuri

ลิงก์ "ซอฟต์แวร์ประสิทธิภาพสูงสำหรับแรสเตอร์ GPU" กล่าวถึงเฉพาะการกรองแบบแอนไอโซทรอปิกในการผ่านครั้งเดียวและไม่ได้กล่าวถึงรายละเอียดใด ๆ ดังนั้นฉันจะแก้ไขมันออกมาจากคำตอบเพราะฉันไม่คิดว่ามันจะเกี่ยวข้องในทางที่เป็นประโยชน์
yuriks

@SimonF นอกจากนี้เรายังสามารถเพิ่มความต้องการแบนด์วิดท์เพิ่มเติมที่น่ากลัวมาก
v.oddou

9

ข้อกำหนด API สามารถพบได้ในสเปคหรือส่วนขยายใด ๆ นี่คือหนึ่ง: https://www.opengl.org/registry/specs/EXT/texture_filter_anisotropic.txt

ผู้จำหน่าย GPU ทั้งหมดน่าจะเบี่ยงเบนจากข้อมูลจำเพาะเนื่องจากคุณภาพ 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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.