กราฟฉากสำหรับเครื่องยนต์การแสดงผลที่เลื่อนออกไป


10

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

ในเครื่องมือการเรนเดอร์ปกติ (forward render) ฉันจะเพิ่มรายการทั้งหมด (การใช้ IDrawable และ IUpdateAble) ไปยังกราฟฉากของฉันมากกว่าการเดินทางไปยังกราฟฉากกว้างก่อนและเรียก Draw () ทุกที่

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

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

คำตอบ:


6

วิธีที่ฉันใช้ในโครงการ C ++ คือฉากกราฟ (ซึ่งมีดัชนีเชิงพื้นที่) เติมค่า 'std :: vector ของจำนวนครั้งที่เข้าชมโดยดูจาก frustum ที่กำลังดูอยู่ในปัจจุบัน รายการที่มองเห็นได้นี้ได้รับการจัดการโดยฉากกราฟดังนั้นจะคำนวณใหม่เฉพาะเมื่อกล้องเคลื่อนย้าย - วัตถุที่เคลื่อนไหวในกราฟจะถูกย้ายในรายการนี้และใช้หลุมฝังศพและรายการเปลี่ยนแปลงที่ไม่เรียงลำดับ

รายการของรายการที่มองเห็นจะถูกจัดเรียงตาม shader-ID ก่อนและภายในแต่ละประเภทตามระยะทางจากกล้อง รหัส shader นั้นได้รับการกำหนดให้ภูมิประเทศเรียงลำดับก่อนแล้วจึงทำการสร้างและจากนั้นหน่วยและจากนั้นก็จะทำการโปรเจ็คเตอร์แล้วก็อนุภาคและอื่น ๆ - มันเป็น RTS บางรุ่นมีมากกว่าหนึ่ง shader แต่พวกเขาโฆษณา shader หลักเท่านั้น เมื่อพวกเขาถูกขอให้วาดสิ่งที่ต้องการบิตที่ถูกวาดด้วย shader อื่นก็เพิ่มตัวเองลงในลิสต์ลิงก์เดี่ยวถัดไป

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

การวาดภาพจากด้านหน้าไปด้านหลังและทึบแสงจากนั้นโปร่งใสช่วยให้ทุกอย่างมีสติ

นี่อาจจะไม่ใช่การลดจำนวนการเปลี่ยนแปลงของ shader ฯลฯ แต่มันก็สามารถใช้งานได้และตรงไปตรงมาเพื่อนำมาใช้

ฉันไม่มีความคิดเกี่ยวกับ XNA และวิธีการใช้งานนี้และสิ่งที่คุณสร้างในระดับต่ำฉันกลัว มันจะน่าสนใจที่สุดที่จะรู้ว่าทหารผ่านศึกคิดอย่างไรกับวิธีนี้สำหรับ C ++ RTS


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

3

คำแนะนำของฉันจะเป็นแบบ 2 ขั้นตอนที่ปรับให้เข้ากับข้อกำหนดเฉพาะของคุณคล้ายกับสิ่งที่คุณอธิบายด้วยตัวคุณเอง คุณต้องมีกราฟฉากและ "คอลเลกชันเรนเดอร์" สำหรับแต่ละขั้นตอนการเรนเดอร์ในเงากรณีของคุณเรขาคณิตไฟ (อาจเป็นวัตถุที่สี่ที่โปร่งใส)

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

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

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

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

เนื่องจากโครงสร้างข้อมูลของคุณมีการแทรกที่รวดเร็วและไม่สร้างขยะจึงไม่มีบทลงโทษสำหรับการทำรายการซ้ำตามที่คุณกล่าวถึง

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