TLDR: การทำให้ส่วนประกอบประกอบด้วยหลายตาข่ายเริ่มต้นด้วย
ฉันเห็นด้วยกับ Asakeron / Byte56 / Laurent ในอีกทางหนึ่งที่ต้องการระดับระหว่างตาข่าย / วัสดุคู่และเอนทิตี้ของตัวเอง แทนที่จะมอง GraphicsComponent เป็นจุดยอดและวัสดุให้คิดว่ามันเป็นหยดพิกเซลบนแรสเตอร์สุดท้าย - วิธีที่พวกเขาได้รับมีรายละเอียดการใช้งานและไม่มีอะไรเพิ่มเติม
ฉันคิดเกี่ยวกับเรื่องนี้มากสำหรับโครงการของฉันและฉันคิดว่าทางออกที่ดีที่สุดคือการทำให้ GraphicsComponent เป็นองค์ประกอบระดับที่สูงขึ้นมากซึ่งรวมถึงการทำงานของวัตถุ 'Model' แบบดั้งเดิมมาก - เพราะฟังก์ชั่นนี้ไม่จำเป็น! หากต้องการแสดงรูปหลายเหลี่ยมเหล่านี้มากกว่าเพียงแค่ข้อมูลบัฟเฟอร์และจำเป็นต้องมี shader เช่น:
- ตำแหน่งที่คุณพูดถึง
- ข้อมูลการสร้างสกิน / แอนิเมชั่น
- Pass ปัจจุบัน (เช่นหากใช้สอง pass alpha)
- ข้อมูลการส่งเงา (ถ้าคุณทำ)
- ข้อมูลเกี่ยวกับวิธีการปรับปรุงวัสดุและเวลา
- ฟังก์ชั่นการเลือกสรร
และนั่นเป็นเพียงสำหรับสินทรัพย์ 3 มิติโดยไม่พิจารณาระบบอนุภาคป้ายโฆษณา ฯลฯ แต่ทั้งหมดนี้เกี่ยวข้องกับรหัสกราฟิก / การแสดงผลเท่านั้น - มันไม่ส่งผลกระทบต่อฟิสิกส์เสียงหรือการเขียนสคริปต์ดังนั้นจึงสมเหตุสมผล องค์ประกอบกราฟิก / การแสดงผล
ฉันลงเอยด้วย:
Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore //This is the 'game object' - it is passed to the GraphicsController
ModelComponent : GraphicsComponent //This is the actual graphics component, used by the GraphicsController in the context of the game object.
ModelComponentPart : GraphicsComponent //This is also a graphics component
Mesh //These are implementation details
Material
ModelComponentPart : GraphicsComponent
Mesh
Material
Skeleton
Animations
ในเรื่องนี้:
โมเดลคือเนื้อหาเกมใด ๆ ที่มีองค์ประกอบกราฟิก
ModelComponent นั้นคล้ายคลึงกับโมเดลดั้งเดิมและอันที่จริงแล้วสำหรับสินทรัพย์ 3 มิติ ตัวควบคุม GraphicsComponent (ถ้าคุณใช้รูปแบบ Model-View-Controller) เป็นผู้รับผิดชอบในการหาประเภทของสินทรัพย์กราฟิกและวาดอย่างถูกต้อง (โปรดทราบว่า ModelComponent เป็น subclass ของ GraphicsComponent)
นอกจากนี้ยังมีการประนีประนอมสองสามอย่างในเรื่องของความเรียบง่ายและความสามารถในการใช้งานร่วมกันได้เช่น GraphicsComponent แต่ละตัวก็เป็น Entity และ Entity เก็บข้อมูลตำแหน่งโดยตรงดังนั้นมันจึงคำนวณได้ในที่เดียว แต่แนวคิดนั้นเหมือนกัน: GraphicsComponent จำเป็นต้องใช้ในการวาดรายการ - ทั้งหมดที่จำเป็น - ไม่ใช่เพียงสิ่งที่มาจากตัวดัดแปลง