วิธีการผสมอัลฟาเข้ากับฉาก 3 มิติที่ซับซ้อนได้อย่างถูกต้อง?


11

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

นี่เป็นวิธีการที่ฉันคิดมาจนถึงตอนนี้:

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

  • จากนั้นฉันคิดเกี่ยวกับการเรียงลำดับสามเหลี่ยม แต่อันนี้ก็อาจล้มเหลวด้วยฉันคิดว่าฉันไม่แน่ใจว่าจะใช้งานได้อย่างไรมีกรณีที่หายากซึ่งอาจทำให้เกิดปัญหาอีกครั้งซึ่งสามเหลี่ยมสองรูปผ่านกัน ไม่มีใครสามารถบอกได้ว่าใครอยู่ใกล้

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

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

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

คำตอบ:


11

คำตอบสั้น ๆ

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

คำตอบยาว ๆ

นั่นเป็นคำถามที่ยาก หนังสือส่วนใหญ่ที่ฉันอ่านเรียดเรื่องและทิ้งไว้ที่:

เริ่มต้นด้วยการเรนเดอร์วัตถุทึบแสงทั้งหมดจากนั้นผสมผสานวัตถุโปร่งใสที่ด้านบนของวัตถุเหล่านั้นตามลำดับจากด้านหน้าไปด้านหลัง

พูดง่ายกว่าทำเพราะวิธีการที่ชัดเจนของการเรียงลำดับวัตถุด้วยเซนทรอยด์ไม่รับประกันการเรียงลำดับที่ถูกต้อง

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

ด้วยที่กล่าวว่าหนังสือเล่มหนึ่งที่ฉันได้กล่าวถึงการแก้ปัญหาไม่กี่:

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

  • กำหนดเส้นทาง K-Buffer - ใช้การกำหนดเส้นทาง stencil เพื่อจับภาพเศษชิ้นส่วนหลายชั้นต่อพิกเซลต่อรูปทรงเรขาคณิต ข้อเสียเปรียบหลักคือชิ้นส่วนจะต้องมีการเรียงลำดับในการผ่านการประมวลผล

นอกจากนี้ยังกล่าวถึงวิธีแก้ไขปัญหาฮาร์ดแวร์ แต่ฉันไม่คิดว่ามันมีอยู่จริง:

  • F-Buffer - คำสั่งซื้อบัฟเฟอร์ FIFO สำหรับการแสดงผลแบบ Multi-Pass อย่างไรก็ตามการอ่านที่ดีและการแนะนำก็พูดถึงปัญหาการเรียงลำดับความโปร่งใสและวิธีแก้ปัญหาในปัจจุบัน

วิธีแก้ไขอื่น ๆ ที่ไม่ได้ผลลัพธ์ที่สมบูรณ์แบบ แต่ดีกว่าไม่มีอะไร:

  • หลังจากที่การแสดงผลวัตถุทึบแสงทั้งหมดให้ใช้ Z-buffer ทดสอบวัตถุโปร่งใส แต่ปิดการใช้งานการเขียน Z-บัฟเฟอร์ คุณอาจได้รับสิ่งประดิษฐ์บางอย่างจากการเรียงลำดับที่ไม่ถูกต้อง แต่อย่างน้อยวัตถุโปร่งใสทั้งหมดจะมองเห็นได้

และอ้างถึงเอกสารไวท์เปเปอร์บัฟเฟอร์ F ด้านบน:

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


11

คำตอบที่ถูกต้องคือ # 1: จัดเรียงทุกสิ่งของคุณด้วยความลึกและทำให้พวกเขา (เห็นได้ชัดว่าปิดการเขียนเชิงลึก แต่ไม่ใช่การทดสอบ) "สิ่ง" คืออะไร?

แต่ละสิ่ง "" จะต้องเป็นวัตถุนูน; มันไม่สามารถทับซ้อนกันได้ หากคุณมีวัตถุที่เว้ามันจะต้องแตกออกเป็นชิ้นนูน

นี่คือวิธีมาตรฐานในการแสดงผลเป็นฉากที่โปร่งใส มันแก้ปัญหาการแทรกซึมหรือไม่? ไม่มันแก้ปัญหากรณีที่คุณมีวัตถุ 3 ชิ้นที่ไม่สามารถระบุความลึกได้ ไม่ได้มันแก้ปัญหากรณีที่คุณมีวัตถุยาวที่ทับซ้อนกับวัตถุขนาดเล็กที่อยู่ใกล้ศูนย์กลางความลึกหรือไม่? เลขที่

แต่ก็ทำงานได้ดีพอ เกมไม่ใช้การลอกแบบลึก พวกเขาไม่ได้ใช้ k-buffer เส้นทางที่มีลายฉลุ พวกเขาไม่ได้ใช้บัฟเฟอร์ F ทำไม? เพราะสิ่งเหล่านี้ช้าอย่างไม่น่าเชื่อ

คุณอาจได้รับสิ่งประดิษฐ์ด้วยวิธีมาตรฐาน แต่อย่างน้อยเกมของคุณจะวิ่งเร็วพอสมควร

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

ฉันไม่รู้ว่าเทคนิคมีชื่อที่น่าสนใจหรือไม่ แต่มีการใช้งานหนึ่งอย่างสำหรับ pre-GL4.2 ที่นี่ รุ่น D3D11 สามารถพบได้ที่นี่ (Powerpoint, PPSX, ฟรีได้)


คะแนนดีสำหรับคำตอบนี้ ฉันเองก็พอใจด้วยดีพอ (ซึ่งฉันอธิบายในคำตอบของฉันว่าเป็นวิธีแก้ปัญหา) เนื่องจากเทคนิคส่วนใหญ่ที่ฉันระบุไว้อาจเป็นปัญหามากกว่าที่พวกเขาควรค่า นอกจากนี้เทคนิคที่น่าสนใจในตอนท้ายฉันไม่คิดว่ามันถูกระบุไว้ในการแสดงผลแบบเรียลไทม์ซึ่งฉันค้นคว้าคำตอบของฉัน ฉันเป็น Noob ที่สมบูรณ์เมื่อพูดถึงฟีเจอร์ระดับ DX11
David Gouveia

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