เพราะเหตุใดเกมสมัยใหม่จึงใช้วิธีการเรนเดอร์ - เคอร์สำหรับกระจก


40

เมื่อดูเกมเก่า ๆ อย่าง Mario64 หรือ DukeNukem3D มิเรอร์ทั้งหมดในเกมนั้นเป็นเพียงแค่รูบนกำแพงพร้อมกับสำเนาของรูปทรงเรขาคณิตแบบมิเรอร์ที่ด้านหน้ากระจก ในกรณีของ DukeNukem3D เราสามารถเปิดใช้งานไม่มีคลิปและเดินเข้าไปในห้องกระจก

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

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


14
ถ้าคุณต้องการกระจกติดประตูระหว่างห้องสองห้องล่ะ?
Superbest

คำตอบ:


37
  1. การใช้ RTT (render-to-texture) ช่วยให้สามารถปรับคุณภาพการแสดงผลได้อย่างง่ายดาย (ความละเอียด, LOD, ความซับซ้อนของแสง) เพื่อประสิทธิภาพที่ปรับได้ RTT ยังช่วยให้ง่ายขึ้นในการเปลี่ยนพื้นผิวด้วย cubemap ในระยะทางที่ยากต่อการมองเห็นการสะท้อน
  2. เนื่องจากเอาต์พุตเป็นพื้นผิวจึงมีตัวเลือกเพิ่มเติมเกี่ยวกับสิ่งที่สามารถทำได้หลังจากนั้น (แสงเงาแรเงาผสมบิดเบือน ฯลฯ )
  3. หากมีการวางรูปแบบเรขาคณิตของมิเรอร์ไว้ในฉากมันจะต้องใช้การเลือกสรรที่ซับซ้อนมากขึ้นเมื่อมันตัดกับเรขาคณิตจริงและสามารถมองเห็นได้หลังมุม ในเกมที่เก่ากว่าระดับต่างๆถูกออกแบบมาเพื่อหลีกเลี่ยงสิ่งนี้ ไม่ต้องพูดถึงว่ามีคนทำกระจกเงาที่แท้จริง
  4. หากรูปทรงเรขาคณิตไม่ได้ถูกมิเรอร์ด้วยตนเองการเรนเดอร์จะต้องกระทำโดยการเปลี่ยนเมทริกซ์มุมมองและโหมดการเลือกสรร (เพื่อชดเชยการผกผันของอวกาศในเมทริกซ์) และการใช้บัฟเฟอร์ลายฉลุเพื่อตัดมิเรอร์ เอ็นจิ้นสมัยใหม่ต้องการสร้างสถานะการเรนเดอร์ทั้งหมดล่วงหน้าดังนั้นจะมีปัญหาเล็กน้อยเกี่ยวกับการสร้างสำเนาของสถานะการเรนเดอร์ทุกฉากด้วยการเปลี่ยนแปลงที่จำเป็นสำหรับการเรนเดอร์มิเรอร์

ดังนั้นการใช้ RTT นั้นให้อิสระกับทุกคนมากขึ้น


ในวันที่ 3: เอ็นจิ้นเกม FPS ส่วนใหญ่ (เก่ากว่า) ใช้อัลกอริธึมการแบ่งครึ่ง (เช่น DOOM ที่มีชื่อเสียง "พอร์ทัลเอ็นจิ้น" DOOM ใช้) ซึ่งทำการตัดรูปหลายเหลี่ยม เอ็นจิ้นดังกล่าวสามารถเหยียบ "กระจก" รูปสี่เหลี่ยมได้อย่างง่ายดายเป็นช่องมองภาพเข้าไปในห้องด้านหลังกระจกโดยไม่ต้องกังวลเกี่ยวกับรูปทรงเรขาคณิตที่สะท้อนอยู่ด้านนอกของกระจก
dronus

@dronus คืออะไร ทำไมต้องสร้าง "กระจก" ตั้งแต่แรก? เพียงแค่เปิดรูบนกำแพง
S. TarıkÇetin

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

29

ไม่คุณผิด - นั่นไม่ใช่วิธีที่กระจกของ Duke Nukem 3D ทำงานเลย

DN3D ใช้เครื่องยนต์พอร์ทัล การเชื่อมต่อระหว่างสองส่วนใดก็ได้โดยพลการและเมื่อเอ็นจิ้นการเรนเดอร์มาที่พอร์ทัลก็รู้ว่าจะต้องเริ่มเรนเดอร์เซกเตอร์อื่นในนั้น ภาคหลังกระจกนั้นเป็นสถานที่จัดการกับการเล่นโวหารในเครื่องยนต์ - จุดเดียวของภาคคือใหญ่กว่าสิ่งที่คุณต้องการ "สะท้อน" มันไม่มีรูปทรงเรขาคณิตที่แท้จริง ในความเป็นจริงมันใช้งานได้ดีในลักษณะเดียวกับ "พอร์ทัล" ในพอร์ทัล - ยกเว้นว่าพอร์ทัล (ตัวเองเป็นฐานของเครื่องมือพอร์ทัล) สร้างพอร์ทัลที่รันไทม์และมีการ จำกัด จำนวนครั้งที่พอร์ทัลสามารถเรียกคืนได้ (เช่น A -> B -> A -> B -> A ... ) ในขณะที่ Build (DN3D) จะผิดพลาดเนื่องจากสแตกของมันล้นหากคุณชี้มิเรอร์ไปที่มิเรอร์อื่น

เห็นได้ชัดว่ามันง่ายแค่ไหนในการนำกระจกเงามาใช้สร้างพอร์ทัลที่ชี้กลับเข้าไปในห้อง นี่หมายความว่าการเรนเดอร์กระจกจะมีค่าใช้จ่ายเท่ากันกับการเรนเดอร์ห้องเองให้ประสิทธิภาพที่ยอดเยี่ยมและความสม่ำเสมอ ตราบใดที่คุณไม่ได้ส่องกระจกอีกตัวหนึ่งนั่นก็คือ หากคุณมองผ่านซอร์สโค้ดของ Build engine คุณจะเห็นว่าไม่มีการจัดการโค้ดมิเรอร์เลย - ไม่จำเป็นต้องเป็นรหัสเพราะนั่นเป็นวิธีการทำงานของพอร์ทัล หมายเหตุ: จริงๆแล้วมีรหัสให้พลิกพิกเซลที่เรนเดอร์ - มัน เพียงแค่ไม่พลิกเรขาคณิตและสไปรต์และเอฟเฟกต์ต่างๆ. บรรณาธิการต้องสามารถสร้างพอร์ทัล "ปลอม" เหล่านี้ได้ - มองย้อนกลับไป หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับสมาร์ทเครื่องยนต์รูปร่างค่อนข้างมีการวิเคราะห์ที่ดีโดย Fabien Sanglard ที่internals เครื่องยนต์รูปร่าง เอ็นจิ้นทั้งหมดได้รับการเปิดแหล่งที่มาและส่งไปยังแพลตฟอร์มที่ทันสมัยเช่นกันแม้ว่าอันเก่ายังคงทำงานได้อย่างไม่มีที่ติใน Windows 10 (ทดสอบสำหรับคุณ: P) หลายเกมที่ใช้ Build ได้รับการเปิดแหล่งที่มาและ / หรือเหล็กไหล

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

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

อย่างไรก็ตามแม้จะมีทั้งหมดที่มีเกมมากมายที่มีการเร่งความเร็ว 3 มิติของฮาร์ดแวร์ที่ทำสิ่งต่าง ๆ "ของจริง" ยกตัวอย่างเช่นเกมเก่า ๆ Quake 3 หรือ Alien vs. Predator เท่าที่ฉันรู้เกม Source engine ยังคงใช้กระจก "ของจริง" หากคุณคาดหวังว่าผู้คนจะเข้าใกล้กระจกและคุณสามารถรับประกันได้ว่าไม่มีพื้นผิวสะท้อนแสงมากเกินไปในเวลาเดียวกัน (เช่นผ่านการออกแบบระดับ) กระจกพอร์ทัลก็ยังคงน่าสนใจมาก


เห็นได้ชัดว่าเหตุผลที่เชื่อกันโดยทั่วไปว่า Duke Nukem 3D ทำงานในลักษณะนี้คือความจริงที่ว่าในการออกแบบระดับที่เกิดขึ้นจริงพื้นที่ด้านหลังกระจกมีขนาดใหญ่เท่ากับห้องที่สะท้อนแม้ว่าเครื่องมือแสดงผลไม่ต้องการมันจริง
Random832

นอกจากนี้พอร์ทัลที่ไม่ใช่มิเรอร์ก็ไม่ได้ทำสิ่งที่สะท้อนดังนั้นฉันจึงไม่รู้ว่า "ไม่มีโค้ดการจัดการมิรเรอร์ " เป็นไปได้อย่างไร
Random832

5
@ Random832 มันเป็นสิ่งที่จำเป็น - มีบางสิ่งที่เป็นภาพถ้ามีบางภาคปรากฏในสถานที่ที่ห้องกระจกควรจะเป็น นั่นเป็นหนึ่งในส่วนที่สมมติฐานที่ไม่เป็นอันตรายส่วนใหญ่มีความสำคัญต่อประสิทธิภาพ หากคุณเคยเล่นกับ Build คุณอาจสังเกตเห็นว่าเมื่อทั้งสองภาคตัดผ่านที่ระดับความสูงเดียวกันพวกเขาจะทำงานได้ไม่ดี สำหรับการทำมิเรอร์มันทำงานในลักษณะเดียวกับที่ใช้ในชีวิตจริง คุณเคยสงสัยหรือไม่ว่าทำไมกระจกจึงสะท้อน "พลิก" บนแกน y เท่านั้น? มันเป็นเหตุผลเดียวกันว่าทำไมคุณไม่จำเป็นต้องพลิกพอร์ทัลที่เชื่อมโยงคุณกลับไปที่ห้องเดียวกัน
Luaan

ประเด็นคือพอร์ทัลปกติที่นำไปสู่ห้องที่หันไปในทิศทางตรงกันข้ามจะต้องหมุนสิ่ง 180 องศาแทนที่จะสะท้อนพวกมัน ดังนั้นการมีความสามารถในการไม่ทำเช่นนั้นจึงถือว่าเป็นการจัดการพิเศษสำหรับกระจก (การไม่มีความสามารถในการทำเช่นนั้นหมายความว่าพอร์ทัลไม่ทำงานเป็นพอร์ทัลและเหมาะสำหรับมิเรอร์เท่านั้นซึ่งในกรณีนี้ทั้งระบบมีการจัดการพิเศษสำหรับมิเรอร์) และใช่ฉันรู้ว่าทำไมสะท้อน "เพียง" พลิก "บนแกน y" ในความเป็นจริงพวกเขาพลิกบนแกน z แต่ความจริงที่ว่าพวกเขาพลิกแกนจำนวนคี่ทำให้พวกเขาแตกต่างจากพอร์ทัล
Random832

@ Random832 ขึ้นอยู่กับสิ่งที่คุณเรียกว่าแกน y แน่นอน :) และใช่คุณพูดถูกมีการจัดการพิเศษ แต่มันน่าสนใจมาก - มันพลิกข้อมูลที่เรนเดอร์ไม่ใช่รูปทรงเรขาคณิต (และสไปรต์และทุกสิ่ง ... เป็นงานที่ค่อนข้างจริง) เฟรมพอร์ทัลถูกพลิกพอร์ทัลจะถูกสร้างการแสดงผลตามปกติจากนั้นทุกสิ่งจะถูกแสดงผลย้อนหลังทีละบรรทัด
Luaan

3

RTT จะถูกใช้ถ้าเป็นไปได้ แต่ไปป์ไลน์การแสดงผลฮาร์ดแวร์เป็นวิธีหนึ่ง

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

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


1

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

เนื่องจากมีบริเวณที่ทำเครื่องหมายไว้คุณจะไม่วางรูปเรขาคณิตใด ๆ โดยไม่ตั้งใจ

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