หากคุณต้องการบรรทัดฐานต่อหน้าเท่านั้นและหาก texcoords ของคุณสำหรับใบหน้านั้นเคร่งครัด 0/0, 0/1, 1/0, 1/1 (หรือคล้ายกับรูปแบบของคุณ) คุณสามารถสร้างคิวบ์ได้ 8 verts และทั้ง 30 (แถบที่มีการรีสตาร์ท) หรือดัชนี 36 (รายการ) ดึงข้อมูล normals และ texcoords โดยใช้การค้นหา array คงที่โดยอ้างอิงจาก SV_VertexID ในจุดสุดยอดของคุณ
การทำเช่นนี้หมายความว่าคุณไม่จำเป็นต้องรวม texcoords หรือ normals ลงในบัฟเฟอร์จุดสุดยอดของคุณซึ่งจะช่วยให้คุณประหยัดหน่วยความจำมากยิ่งขึ้น
คุณสามารถไปต่อที่ 24 verts ต่อคิวบ์ แต่ยังใช้อินสแตนซ์ แต่ละคิวบ์จะมีขนาดคงที่ในบัฟเฟอร์จุดสุดยอดของคุณ (1x1x1) และคุณจะมีตัวประกอบสเกลและตำแหน่ง (สมมติว่าคิวบ์ของคุณไม่หมุนเมทริกซ์ถ้าเป็นเช่นนั้น) เป็นข้อมูลต่ออินสแตนซ์ ในกรณีที่ไม่หมุนคุณจะต้องเสียค่าใช้จ่าย 24 verts ครั้งเดียว แต่จากนั้นแต่ละคิวบ์ต้องการเพียง 6 ลอยเพื่อระบุอย่างเต็มที่ ในกรณีหมุนคุณดูที่ 16 ลอย แต่แม้จะประหยัดมาก (คุณมีแนวโน้มที่จะคอขวดด้าน CPU ในเมทริกซ์แปลงในกรณีนี้ - สำหรับกรณีที่ไม่หมุนสร้างเมทริกซ์ได้ทันที จุดสุดยอดของคุณ shader - แม้ว่ามันจะทำต่อจุดสุดยอดอย่างรวดเร็วอย่างโง่เขลาที่คุณไม่จำเป็นต้องกังวลเกี่ยวกับมัน)
สำหรับพื้นผิวต่อหน้าเพียงใช้อาร์เรย์พื้นผิว คุณต้องตรวจสอบให้แน่ใจว่าแต่ละพื้นผิวในอาร์เรย์นั้นมีขนาดเท่ากันและคุณยังต้องแบ่งแบทช์ปัจจุบันของคุณถ้าอาเรย์นั้นต้องการเปลี่ยน แต่ไม่เช่นนั้นมันจะทำงานได้ดี เพิ่ม texcoord ตัวที่สามให้กับนิยามจุดสุดยอดของคุณซึ่งกำหนดชิ้นส่วนของอาร์เรย์ที่จะใช้สำหรับแต่ละหน้า
คุณไม่ต้องการ GS กับสิ่งนี้และมันควรจะทำงานได้เร็วกว่าการใช้อันใดอันหนึ่งเนื่องจากการเปิดใช้งานส่วนที่มีรูปทรงเรขาคณิตจะทำให้มีค่าใช้จ่ายเพิ่มขึ้น
ฉันใช้รหัสเบนช์มาร์กในเอนจินของฉันที่เพิ่งวาดกลุ่มก้อนโดยใช้วิธีนี้และฉันสามารถเคี้ยวได้มากกว่า 300,000 ลูกในขณะที่ยังคงทำการล้าง 60fps บน GPU ที่ค่อนข้างต่ำและไม่ทำอะไรเลยเพื่อเพิ่มประสิทธิภาพของกระบวนการ . เป็นที่ยอมรับว่าฉันไม่ใช่แสงหรือการทำพื้นผิว แต่ฉันมีการเปิดใช้งานการผสมอัลฟา backface การเลือกสรรการปิดการใช้งานและโดยรวมมันสมดุลกับส่วนของฉัน "ไม่ทำอย่างอื่นเพื่อเพิ่มประสิทธิภาพ" ดังนั้นจึงควรให้ความคิดที่เหมาะสม ballpark คุณสามารถตีด้วยวิธีนี้