พื้นผิวเสมือนจริงจะมีประสิทธิภาพได้อย่างไร


27

สำหรับการอ้างอิงสิ่งที่ฉันหมายถึงคือ "ชื่อสามัญ" สำหรับเทคนิคแรก (ฉันเชื่อ) ที่นำมาใช้กับเทคโนโลยีMegaTextureของ idTech 5 ดูวิดีโอที่นี่เพื่อดูว่ามันทำงานอย่างไร

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

มีอะไรมากมายที่ฉันไม่เข้าใจและฉันไม่สามารถหาแหล่งข้อมูลที่เข้าถึงได้ง่ายในหัวข้อนี้

คำตอบ:


20

ภาพรวม

เหตุผลหลักสำหรับ Virtual Texturing (VT) หรือSparse Virtual Texturesซึ่งบางครั้งเรียกว่าเป็นการเพิ่มประสิทธิภาพหน่วยความจำ ส่วนสำคัญของสิ่งนี้คือย้ายไปยังหน่วยความจำวิดีโอเฉพาะเท็กซัสจริง (ทั่วไปเป็นหน้า / ไทล์) ที่คุณอาจต้องการสำหรับเฟรมที่แสดงผล ดังนั้นมันจะช่วยให้คุณมีข้อมูลพื้นผิวมากขึ้นในการออฟไลน์หรือที่เก็บข้อมูลช้า (HDD, Optical-Disk, Cloud) มากกว่าที่จะเหมาะกับหน่วยความจำวิดีโอ หากคุณเข้าใจแนวคิดของหน่วยความจำเสมือนที่ใช้โดยระบบปฏิบัติการที่ทันสมัยมันเป็นสิ่งเดียวกันในสาระสำคัญของมัน (ชื่อไม่ได้รับโดยไม่ได้ตั้งใจ)

VT ไม่จำเป็นต้องทำการคำนวณ UV ใหม่อีกครั้งในแง่ที่ว่าคุณทำในแต่ละเฟรมก่อนเรนเดอร์ตาข่ายจากนั้นส่งข้อมูลจุดสุดยอดอีกครั้ง แต่มันต้องการงานจำนวนมากในเครื่อง Vertex และ Fragment shader ในการนำไปใช้ที่ดีควรมีความโปร่งใสอย่างสมบูรณ์สำหรับแอปพลิเคชันหากใช้พื้นผิวเสมือนจริงหรือแบบดั้งเดิม ที่จริงแล้วส่วนใหญ่แอปพลิเคชั่นจะผสมพื้นผิวทั้งแบบเสมือนและแบบดั้งเดิมเข้าด้วยกัน

ในทางทฤษฎีแล้วงานแบตช์ทำได้ดีมากแม้ว่าฉันจะไม่เคยดูรายละเอียดของเรื่องนี้ เนื่องจากเกณฑ์ปกติสำหรับการจัดกลุ่มรูปทรงเรขาคณิตนั้นเป็นพื้นผิวและด้วย VT รูปหลายเหลี่ยมทุกฉากสามารถแบ่งปันพื้นผิว "ขนาดใหญ่สุดอนันต์" ในทางทฤษฎีคุณสามารถบรรลุการวาดฉากแบบเต็มด้วยการดึง 1 ครั้ง แต่ในความเป็นจริงแล้วมีปัจจัยอื่นเข้ามาทำให้สิ่งนี้ไม่สามารถทำได้

ปัญหาเกี่ยวกับ VT

การซูมเข้า / ออกและการเคลื่อนไหวของกล้องกะทันหันเป็นสิ่งที่ยากที่สุดในการจัดการในการตั้งค่า VT มันอาจดูน่าสนใจมากสำหรับฉากแบบคงที่ แต่เมื่อสิ่งต่าง ๆ เริ่มเคลื่อนไหวหน้า / แผ่นพื้นผิวจะถูกร้องขอมากกว่าที่คุณสามารถสตรีมสำหรับการจัดเก็บข้อมูลภายนอก ไฟล์ Async IO และเธรดสามารถช่วยได้ แต่ถ้าเป็นระบบแบบเรียลไทม์เช่นเดียวกับในเกมคุณจะต้องทำการเรนเดอร์เฟรมสองสามเฟรมที่มีความละเอียดต่ำกว่าจนกว่าจะมีความละเอียดสูงมาถึงตอนนี้ ส่งผลให้พื้นผิวพร่ามัว ไม่มีกระสุนเงินที่นี่และนั่นเป็นปัญหาที่ใหญ่ที่สุดของเทคนิค IMO

การสร้างพื้นผิวเสมือนยังไม่สามารถจัดการกับความโปร่งใสได้ในวิธีที่ง่ายดังนั้นรูปหลายเหลี่ยมแบบโปร่งใสจึงต้องใช้เส้นทางการเรนเดอร์แบบดั้งเดิมแยกต่างหาก

สรุปแล้ว VT นั้นน่าสนใจ แต่ฉันไม่แนะนำสำหรับทุกคน มันสามารถทำงานได้ดี แต่มันยากที่จะนำไปใช้และปรับให้เหมาะสมรวมถึงมีมุมและตัวปรับแต่งที่เฉพาะเจาะจงมากเกินไปสำหรับรสนิยมของฉัน แต่สำหรับเกมเปิดกว้างหรือแอปพลิเคชั่นการสร้างภาพข้อมูลอาจเป็นวิธีเดียวที่เป็นไปได้ในการปรับเนื้อหาทั้งหมดให้เป็นฮาร์ดแวร์ที่มีอยู่ มีจำนวนมากของการทำงานก็สามารถทำเพื่อให้ทำงานได้อย่างมีประสิทธิภาพเป็นธรรมแม้ในฮาร์ดแวร์ จำกัด เหมือนอย่างที่เราสามารถมองเห็นใน PS3 และ XBOX360 รุ่นของ id ของความโกรธ

การดำเนินงาน

ฉันจัดการให้ VT ทำงานบน iOS ด้วย OpenGL-ES ได้ในระดับหนึ่ง การใช้งานของฉันไม่ได้เป็น "shippable" แต่ฉันสามารถทำได้ถ้าฉันต้องการและมีทรัพยากร คุณสามารถดูซอร์สโค้ดได้ที่นี่มันอาจช่วยให้เข้าใจได้ดีขึ้นว่าชิ้นส่วนเข้าด้วยกัน นี่คือวิดีโอการสาธิตที่ทำงานบน iOS Sim มันดูล้าหลังมากเพราะเครื่องมือจำลองนั้นน่ากลัวในการเลียนแบบเฉดสี แต่มันทำงานได้อย่างราบรื่นบนอุปกรณ์

แผนภาพต่อไปนี้แสดงองค์ประกอบหลักของระบบในการนำไปใช้ของฉัน มันแตกต่างกันเล็กน้อยจากการสาธิต SVT ของ Sean (ลิงค์ลงด้านล่าง) แต่มันอยู่ใกล้กับสถาปัตยกรรมมากขึ้นกว่าที่นำเสนอโดยกระดาษเร่งการพื้นผิวเสมือนโดยใช้ CUDAซึ่งพบในหนังสือ GPU Pro เล่มแรก (ลิงค์ร้อง)

ระบบพื้นผิวเสมือน

  • Page Filesเป็นพื้นผิวเสมือนจริงซึ่งถูกตัดเป็นไทล์ (หน้า AKA) เป็นขั้นตอนก่อนการประมวลผลดังนั้นพวกเขาจึงพร้อมที่จะย้ายจากดิสก์ไปยังหน่วยความจำวิดีโอได้ทุกเมื่อที่ต้องการ ไฟล์หน้านอกจากนี้ยังมีทั้งชุดของ mipmaps เรียกว่าmipmaps เสมือน

  • Page Cache Managerเก็บการแทนค่าด้านแอปพลิเคชันของPage TableและPage Indirectionพื้นผิว เนื่องจากการย้ายหน้าจากที่เก็บข้อมูลออฟไลน์ไปยังหน่วยความจำมีราคาแพงเราจึงต้องมีแคชเพื่อหลีกเลี่ยงการโหลดซ้ำสิ่งที่มีอยู่ แคชนี้เป็นแคชที่ใช้ล่าสุดน้อยที่สุด (LRU) อย่างง่าย แคชยังเป็นองค์ประกอบที่รับผิดชอบในการรักษาพื้นผิวทางกายภาพที่ทันสมัยด้วยการเป็นตัวแทนในท้องถิ่นของข้อมูล

  • The Page Provideris a คิวงาน async ที่จะดึงข้อมูลหน้าที่จำเป็นสำหรับการรับชมฉากและส่งพวกเขาไปยังแคช

  • Page Indirectionเนื้อเป็นเนื้อกับหนึ่งพิกเซลสำหรับแต่ละหน้า / กระเบื้องในเนื้อเสมือนที่จะแม UVS เข้ากับPage Tableพื้นผิวแคชที่มีข้อมูลเทคที่เกิดขึ้นจริง พื้นผิวนี้มีขนาดค่อนข้างใหญ่ดังนั้นจึงต้องใช้รูปแบบกะทัดรัดบางอย่างเช่น RGBA 8: 8: 8: 8 หรือ RGB 5: 6: 5

Page Tableแต่เรายังคงหายไปชิ้นสำคัญที่นี่และที่วิธีการตรวจสอบที่หน้าเว็บต้องโหลดจากการจัดเก็บในแคชและจึงลงไป นั่นคือสิ่งที่ข้อเสนอแนะผ่านและPage Resolverป้อน

ผลตอบรับผ่านการแสดงผลล่วงหน้าของมุมมองที่มี shader ที่กำหนดเองและที่ความละเอียดที่ต่ำกว่ามากที่จะเขียนรหัสของหน้าเว็บที่จำเป็นในการ framebuffer สี การเย็บปะติดปะต่อกันที่มีสีสันของลูกบาศก์และทรงกลมด้านบนเป็นดัชนีหน้าจริงที่เข้ารหัสเป็นสี RGBA การแสดงผลก่อนรหัสผ่านนี้จะถูกอ่านแล้วลงในหน่วยความจำและการประมวลผลโดยการถอดรหัสดัชนีหน้าและไฟคำขอใหม่ที่มีPage ResolverPage Provider

หลังจากป้อนกลับผลตอบรับล่วงหน้าฉากสามารถแสดงผลได้ตามปกติด้วยตัวค้นหา VT แต่โปรดทราบว่าเราไม่ต้องรอให้การร้องขอหน้าใหม่เสร็จสิ้นซึ่งอาจเป็นเรื่องที่แย่มากเพราะเราเพียง แต่บล็อกไฟล์ซิงโครนัส IO เท่านั้น คำร้องขอแบบอะซิงโครนัสและอาจหรืออาจไม่พร้อมในเวลาที่การแสดงผลสุดท้าย หากพร้อมแล้วก็น่ารัก แต่ถ้าไม่ใช่เรามักจะเก็บหน้าของ mipmap ที่มีความละเอียดต่ำไว้ในแคชเป็นทางเลือกดังนั้นเราจึงมีข้อมูลพื้นผิวบางส่วนไว้ใช้งาน แต่มันจะพร่ามัว

แหล่งข้อมูลอื่น ๆ ที่ควรค่าแก่การตรวจสอบ

  • หนังสือเล่มแรกในGPU ชุด มันมีสองบทความที่ดีมากใน VT

  • กระดาษบังคับโดย MrElusive: ซอฟท์แวพื้นผิวเสมือนจริง

  • กระดาษ Crytek โดยมาร์ติน Mittring: หัวข้อเนื้อเสมือนขั้นสูง

  • และการนำเสนอของฌอนใน youtubeซึ่งฉันเห็นว่าคุณได้พบแล้ว

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


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

1
@Llamageddon มันเกิดขึ้นเพียงว่าฉันยังมีแผนภาพอยู่ในมือ;) ฉันกลัวรหัสหลอกกำลังจะได้รับบิตยากที่จะให้เนื่องจากมีรหัสจริง ๆ แต่ฉันหวังว่าคำตอบที่ขยายจะช่วยให้ความคิดทั่วไปของเทคนิค
glampert

3
เป็นที่น่าสังเกตว่าฮาร์ดแวร์ที่ทันสมัยส่วนใหญ่ในขณะนี้เปิดเผยตารางเพจที่ตั้งโปรแกรมได้ทำให้ไม่จำเป็นต้องใช้พื้นผิวการเปลี่ยนเส้นทาง นี้ถูกเปิดเผยผ่านเช่นdirectx12 ทรัพยากรที่สงวนไว้ซึ่งสร้างบนDirectX11 ทรัพยากรกระเบื้องหรือOpenGL พื้นผิวเบาบาง
MooseBoys

1
@Llamageddon ความคิดเห็น pre-pass สามารถทำได้ที่ความละเอียดต่ำเพื่อบันทึกการคำนวณและหน่วยความจำให้มากที่สุดเนื่องจากพิกเซลสำหรับหน้าจะทำซ้ำโดยทั่วไป (คุณสามารถสังเกตเห็นสี่เหลี่ยมสีขนาดใหญ่ในการสาธิตของฉัน) คุณถูกต้องว่าในที่สุดอาจพลาดหน้าที่มองเห็นได้เช่นนั้น แต่โดยทั่วไปจะไม่ได้รับผลกระทบต่อภาพขนาดใหญ่เพราะระบบควรเก็บอย่างน้อย mipmap ต่ำสุดของ VT ทั้งหมดที่มีอยู่ในแคช กระดาษแผ่นที่สองที่ฉันเชื่อมโยงมีตัวอย่าง shader ทั้งหมดในภาคผนวกคุณยังสามารถอ้างถึง repo สำหรับโครงการของฉันเองพวกเขาคล้ายกัน
glampert

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

11

พื้นผิวเสมือนจริงเป็นตรรกะที่รุนแรงของพื้นผิวแผนที่


Atlas พื้นผิวเป็นพื้นผิวขนาดยักษ์ที่มีพื้นผิวสำหรับแต่ละตาข่ายภายใน:

ตัวอย่าง Atlas พื้นผิว

แผนที่พื้นผิวได้รับความนิยมเนื่องจากความจริงที่ว่าการเปลี่ยนพื้นผิวทำให้ขั้นตอนการทำงานเต็มไปด้วย GPU เมื่อสร้างตาข่าย UV จะถูกบีบอัด / เลื่อนเพื่อให้แสดงถึง 'ส่วน' ที่ถูกต้องของแผนที่พื้นผิวทั้งหมด

ดังที่ @ nathan-reed พูดถึงในความคิดเห็นหนึ่งในข้อเสียเปรียบหลักของ atlases พื้นผิวคือการสูญเสียโหมดการห่อเช่นการทำซ้ำตัวหนีบเส้นขอบ ฯลฯ นอกจากนี้หากพื้นผิวไม่มีเส้นขอบรอบพอคุณสามารถบังเอิญได้ ตัวอย่างจากพื้นผิวที่อยู่ติดกันเมื่อทำการกรอง สิ่งนี้สามารถนำไปสู่การตกเลือดสิ่งประดิษฐ์

พื้นผิว Atlases มีข้อ จำกัด ที่สำคัญอย่างหนึ่ง: ขนาด API กราฟิกส์วางข้อ จำกัด ที่อ่อนบนพื้นผิวที่สามารถมีขนาดใหญ่ ที่กล่าวว่าหน่วยความจำกราฟิกมีขนาดใหญ่มาก ดังนั้นจึงมีข้อ จำกัด อย่างหนักเกี่ยวกับขนาดพื้นผิวที่กำหนดโดยขนาดของ v-ram ของคุณ พื้นผิวเสมือนแก้ปัญหานี้โดยการยืมแนวคิดจากหน่วยความจำเสมือน

พื้นผิวเสมือนจริงใช้ประโยชน์จากความจริงที่ว่าในฉากส่วนใหญ่คุณจะเห็นเพียงส่วนเล็ก ๆ ของพื้นผิวทั้งหมด ดังนั้นเฉพาะเซตย่อยของพื้นผิวเท่านั้นที่ต้องอยู่ใน vram ส่วนที่เหลือสามารถอยู่ใน RAM หลักหรือบนดิสก์

มีไม่กี่วิธีที่จะใช้มันผมจะอธิบายการดำเนินการอธิบายโดยฌอนบาร์เร็ตต์ในของเขามี แต่การพูดคุย GDC (ซึ่งฉันขอแนะนำให้ดู)

เรามีองค์ประกอบหลักสามประการคือพื้นผิวเสมือนพื้นผิวจริงและตารางค้นหา

พื้นผิวเสมือนจริง

พื้นผิวเสมือนจริงแสดงให้เห็นถึงแผนที่ขนาดใหญ่ทางทฤษฎีที่เราจะมีถ้าเรามี vram เพียงพอที่จะพอดีกับทุกอย่าง มันไม่มีอยู่จริงในหน่วยความจำ พื้นผิวทางกายภาพแสดงให้เห็นถึงสิ่งที่ข้อมูลพิกเซลที่เรามีจริงใน vram ตารางการค้นหาคือการแมประหว่างทั้งสอง เพื่อความสะดวกเราแบ่งองค์ประกอบทั้งสามออกเป็นขนาดเท่ากันหรือหลายหน้า

ตารางการค้นหาจะจัดเก็บตำแหน่งของมุมบนซ้ายของแผ่นกระเบื้องในพื้นผิวทางกายภาพ ดังนั้นเมื่อให้รังสียูวีกับพื้นผิวเสมือนทั้งหมดเราจะได้รังสียูวีที่สอดคล้องกันสำหรับพื้นผิวทางกายภาพได้อย่างไร

ก่อนอื่นเราต้องค้นหาที่ตั้งของหน้าภายในพื้นผิวทางกายภาพ จากนั้นเราจำเป็นต้องคำนวณตำแหน่งของ UV ภายในหน้า ในที่สุดเราสามารถเพิ่มสองออฟเซ็ตเหล่านี้เข้าด้วยกันเพื่อให้ได้ตำแหน่งของรังสียูวีภายในพื้นผิวทางกายภาพ

float2 pageLocInPhysicalTex = ...
float2 inPageLocation = ...
float2 physicalTexUV = pageLocationInPhysicalTex + inPageLocation;


กำลังคำนวณ pageLocInPhysicalTex

หากเราทำให้ตารางการค้นหามีขนาดเท่ากับจำนวนของกระเบื้องในพื้นผิวเสมือนเราสามารถลองตารางการค้นหาที่มีการสุ่มตัวอย่างเพื่อนบ้านที่ใกล้ที่สุดและเราจะได้ตำแหน่งของมุมบนซ้ายของหน้าภายในพื้นผิวทางกายภาพ

float2 pageLocInPhysicalTex = lookupTable.Sample(virtTexUV, nearestNeighborSampler);


กำลังคำนวณ inPageLocation

inPageLocation เป็นพิกัด UV ที่สัมพันธ์กับมุมบนซ้ายของหน้าแทนที่จะเป็นมุมบนซ้ายของพื้นผิวทั้งหมด

วิธีหนึ่งในการคำนวณสิ่งนี้คือการลบ UV ที่ด้านซ้ายบนของหน้าออกจากนั้นปรับขนาดของหน้า อย่างไรก็ตามนี่เป็นคณิตศาสตร์นิดหน่อย แต่เราสามารถใช้ประโยชน์จากการแสดง IEEE floating point แทน จุดลอยตัว IEEE เก็บส่วนที่เป็นเศษส่วนของตัวเลขด้วยชุดของเศษส่วนฐาน 2

ป้อนคำอธิบายรูปภาพที่นี่

ในตัวอย่างนี้จำนวนคือ:

number = 0 + (1/2) + (1/8) + (1/16) = 0.6875

ทีนี้มาดูพื้นผิวเสมือนจริงที่ง่ายขึ้น:

พื้นผิวเสมือนง่าย ๆ

1/2 บิตบอกเราว่าเราอยู่ในครึ่งซ้ายของพื้นผิวหรือด้านขวา 1/4 บิตบอกเราว่าเราอยู่ในไตรมาสใดในครึ่งนี้ในตัวอย่างนี้เนื่องจากพื้นผิวถูกแบ่งออกเป็น 16 หรือ 4 ต่อด้านสองบิตแรกเหล่านี้บอกเราว่าเราอยู่ในหน้าที่เหลืออยู่ บิตบอกตำแหน่งภายในหน้า

เราสามารถรับบิตที่เหลือได้โดยขยับลอยด้วย exp2 () และดึงออกด้วยเศษส่วน ()

float2 inPageLocation = virtTexUV * exp2(sqrt(numTiles));
inPageLocation = fract(inPageLocation);

โดยที่ numTiles คือ int2 ที่ให้จำนวนไพ่ต่อด้านของพื้นผิว ในตัวอย่างของเรานี่จะเป็น (4, 4)

ดังนั้นลองคำนวณ inPageLocation สำหรับจุดสีเขียว (x, y) = (0.6875, 0.375)

inPageLocation = float2(0.6875, 0.375) * exp2(sqrt(int2(4, 4));
               = float2(0.6875, 0.375) * int2(2, 2);
               = float2(1.375, 0.75);

inPageLocation = fract(float2(1.375, 0.75));
               = float2(0.375, 0.75);

สิ่งสุดท้ายที่ต้องทำก่อนที่เราจะทำ ปัจจุบัน inPageLocation เป็นพิกัดรังสียูวีใน 'เนื้อที่' เสมือนจริง อย่างไรก็ตามเราต้องการพิกัดรังสียูวีใน 'เนื้อที่' ทางกายภาพ ในการทำเช่นนี้เราเพียงแค่ปรับขนาดในหน้าตำแหน่งโดยอัตราส่วนของขนาดพื้นผิวเสมือนต่อขนาดพื้นผิวทางกายภาพ

inPageLocation *= physicalTextureSize / virtualTextureSize;



ดังนั้นฟังก์ชั่นสำเร็จรูปคือ:

float2 CalculatePhysicalTexUV(float2 virtTexUV, Texture2D<float2> lookupTable, uint2 physicalTexSize, uint2 virtualTexSize, uint2 numTiles) {
    float2 pageLocInPhysicalTex = lookupTable.Sample(virtTexUV, nearestNeighborSampler);

    float2 inPageLocation = virtTexUV * exp2(sqrt(numTiles));
    inPageLocation = fract(inPageLocation);
    inPageLocation *= physicalTexSize / virtualTexSize;

    return pageLocInPhysicalTex + inPageLocation;
}

ฉันไม่ได้ฉันหมายถึงพื้นผิวเสมือนรู้จักกันดีที่สุดเป็น IDTECH 5 MegaTextureเทคโนโลยี ดูที่นี่และสิ่งนี้ด้วย ฉันเคยเห็นมันกล่าวถึงในภาพรวมของท่อการแสดงผลของเครื่องมือที่ทันสมัยจำนวนมากและในเอกสารสองสามฉบับที่ใช้วิธีการที่คล้ายกันสำหรับ shadowmaps มันมีหลายอย่างที่เหมือนกันกับ atlases texture ใช่ใช้มันในทางใดทางหนึ่ง แต่ฉันไม่ได้สับสนกับ atlases texture
Llamageddon

อ่า ขอบคุณสำหรับลิงค์ คุณสามารถเพิ่มพวกเขาในคำถาม ฉันจะอัปเดตคำตอบตามนี้
RichieSams

3
IMO ข้อเสียเปรียบหลักของแผนที่แบบพื้นผิวเรียบ ๆ (ไม่ใช่พื้นผิวเสมือนจริง) คือคุณสูญเสียโหมดการห่อเช่นการทำซ้ำและที่หนีบและการมีเลือดออกเกิดขึ้นเนื่องจากการกรอง / การทำแผนที่ ฉันรู้สึกประหลาดใจที่เห็นความแม่นยำในการลอยตัวกลายเป็นปัญหาสำหรับพื้นผิวธรรมดา (ไม่ใช่เสมือน) แม้แต่พื้นผิว 16K (สูงสุดที่อนุญาตโดย API ปัจจุบัน) ไม่ใหญ่พอที่จะกรองความแม่นยำของการลอย
Nathan Reed

@ RichieSams Btw ฉันคิดว่าคำตอบของคุณเป็นคำตอบที่ดีแม้ว่าจะมีคำถามอื่น คุณควรโพสต์คำถามและคำตอบ
Llamageddon

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