ระดับ mipmap คำนวณได้อย่างไรในโลหะ?


14

คำถามของฉันเกี่ยวกับโลหะโดยเฉพาะเนื่องจากฉันไม่รู้ว่าคำตอบจะเปลี่ยนไปสำหรับ API อื่นหรือไม่

สิ่งที่ฉันเชื่อว่าฉันเข้าใจคือ:

  • พื้นผิวแบบ mipmapped ได้ทำการ "ระดับรายละเอียด" ไว้ล่วงหน้าซึ่งรายละเอียดระดับล่างถูกสร้างขึ้นโดยการสุ่มตัวอย่างพื้นผิวดั้งเดิมด้วยวิธีที่มีความหมายบางอย่าง

  • ระดับ Mipmap ถูกอ้างถึงในรายละเอียดจากมากไปน้อยโดยที่ระดับ0คือพื้นผิวดั้งเดิมและระดับที่สูงกว่าเป็นการลดกำลังของสองระดับ

  • GPU ส่วนใหญ่ใช้การกรอง trilinear ซึ่งเลือกสองระดับ mipmap ข้างเคียงสำหรับแต่ละตัวอย่างตัวอย่างจากแต่ละระดับโดยใช้การกรอง bilinear และจากนั้นผสมตัวอย่างเหล่านั้นเป็นเส้นตรง

สิ่งที่ฉันไม่ค่อยเข้าใจคือเลือกระดับ mipmap เหล่านี้อย่างไร ในเอกสารสำหรับห้องสมุดมาตรฐานโลหะฉันเห็นว่าสามารถเก็บตัวอย่างได้โดยมีหรือไม่มีการระบุอินสแตนซ์ของlod_optionsประเภท ฉันสมมติว่าอาร์กิวเมนต์นี้เปลี่ยนวิธีการเลือกระดับ mipmap และดูเหมือนว่ามีlod_optionsพื้นผิวแบบ 2D สามแบบ:

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

น่าเสียดายที่เอกสารไม่ได้อธิบายว่าตัวเลือกเหล่านี้มีอะไรบ้าง ฉันสามารถเดาได้ว่าbias()อคติบางระดับที่เลือกโดยอัตโนมัติ แต่แล้วความลำเอียงvalueหมายถึงอะไร มันใช้งานได้ในระดับใด? ในทำนองเดียวกันว่าเป็นlodของlevel()การแปลเป็นระดับมิพแมพที่ไม่ต่อเนื่อง? และการทำงานภายใต้สมมติฐานที่gradient2d()ใช้การไล่ระดับสีของพิกัดพื้นผิวการใช้การไล่ระดับสีนั้นเพื่อเลือกระดับ mipmap เป็นอย่างไร

ที่สำคัญกว่านั้นถ้าฉันไม่ใช้lod_optionsระดับ mipmap จะถูกเลือกอย่างไร สิ่งนี้แตกต่างกันไปตามประเภทของฟังก์ชั่นที่ใช้งานหรือไม่

และหากการดำเนินการที่ไม่ได้ระบุตัวเลือกเริ่มต้นของsample()ฟังก์ชั่นนี้คือการทำบางสิ่งเช่นgradient2D()(อย่างน้อยก็ใน shader แฟรกเมนต์) มันใช้อนุพันธ์พื้นที่หน้าจอแบบง่ายหรือทำงานโดยตรงกับ rasterizer และพิกัดพื้นผิว interpolated การคำนวณการไล่ระดับสีที่แม่นยำ

และในที่สุดพฤติกรรมนี้มีความสอดคล้องกันมากน้อยเพียงใดจากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง บทความเก่า (เก่าเหมือนใน DirectX 9) ฉันอ่านอ้างถึงการเลือก mipmap เฉพาะอุปกรณ์ที่ซับซ้อน แต่ฉันไม่ทราบว่าการเลือก mipmap นั้นกำหนดได้ดีกว่าในสถาปัตยกรรมใหม่กว่านี้หรือไม่

คำตอบ:


17

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

เป็นสถานที่ที่ดีในการอ่านเกี่ยวกับการเลือก MIP ในรายละเอียดอยู่ในข้อมูลจำเพาะ OpenGL ส่วน 8.14 "เนื้อ minification" ฉันคิดว่ามันใช้งานได้เหมือนกันใน Metal (Apple อาจมีการเปลี่ยนแปลงบางอย่างโดยพิจารณาว่าพวกเขาทำทั้งฮาร์ดแวร์และ API ... แต่ฉันสงสัยว่าพวกเขามี) ฉันจะสรุปที่นี่

การเลือก mip เริ่มต้น (ไม่ได้ใช้lod_optionsตัวดัดแปลงใด ๆ) ใช้การไล่ระดับสีพื้นที่หน้าจอของพิกัดพื้นผิวเพื่อเลือกระดับ mip โดยพื้นฐานแล้วจะพยายามเลือกระดับ mip ที่ใกล้เคียงที่สุดกับการทำแผนที่ 1: 1 ของ texels เป็นพิกเซล ตัวอย่างเช่นหากการไล่ระดับสีมีความยาว 4 texels ต่อพิกเซลมันจะเลือก mip ระดับ 2 (ซึ่งคือ 1 / 4th ขนาดของระดับ 0 และดังนั้นจึงให้ 1 mel texel ต่อพิกเซล)

ด้วยการกรองแบบ trilinear เนื่องจากคุณมักจะไม่ลงบนแผนที่ 1: 1 ที่แน่นอนมันจะเลือกสองระดับที่ใกล้ที่สุดและสอดแทรกเชิงเส้นตรงระหว่างกันเพื่อให้คุณมีการเปลี่ยนแปลงที่ราบรื่นระหว่างระดับ mip เช่นกล้องหรือวัตถุในฉากของคุณ รอบ

λλλλ=2.8

λเข้าสู่ระบบ2(1/4)=-2

ตอนนี้สำหรับตัวเลือกปรับปรุง:

  • biasλ
  • levelλλlod
  • gradient2dให้คุณใส่เวกเตอร์ไล่ระดับสีของคุณเองซึ่งใช้แทนการไล่ระดับสีพื้นที่หน้าจอโดยปริยายของพิกัดพื้นผิว ส่วนที่เหลือของการเลือก mip และกระบวนการสุ่มตัวอย่างดำเนินไปตามปกติ แต่ด้วยการไล่ระดับสีที่เปลี่ยนแปลง สิ่งนี้ช่วยให้คุณปรับแต่งการกรองแบบแอนไอโซทรอปิก

ในเฉดสีประเภทอื่นนอกเหนือจากตัวแยกส่วนมีความคิดเกี่ยวกับ "การไล่ระดับสีของหน้าจอพื้นที่" ดังนั้นการดำเนินการสองหลังหลังโดยทั่วไปเป็นสิ่งเดียวที่ได้รับอนุญาต - การดำเนินการใด ๆ ที่พยายามใช้การไล่ระดับสีโดยนัยจะทำให้เกิดข้อผิดพลาดในการคอมไพล์ ฉันไม่ได้คิดว่าเป็นสิ่งที่ Metal ทำ แต่เป็นสิ่งที่ฉันคาดหวังจากการทำงานกับ API อื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.