วิธีที่ดีที่สุดในการอัปเดตเครื่องแบบ shader คืออะไร?


10

อะไรคือวิธีที่ได้รับการยอมรับมากที่สุดในการรักษาเมทริกซ์ของ shader ให้ทันสมัยและทำไม?

ตัวอย่างเช่นในตอนนี้ฉันมีShaderชั้นเรียนที่จัดเก็บด้ามจับไปยังโปรแกรมและชุดเครื่องแบบ GLSL ทุกครั้งที่ฉันขยับกล้องฉันจะต้องผ่านเมทริกซ์มุมมองใหม่ไปยัง shader จากนั้นวัตถุทุกอย่างในโลกที่แตกต่างกันฉันจะต้องผ่านเมทริกซ์โมเดลไปยัง shader

สิ่งนี้ จำกัด ฉันอย่างรุนแรงเนื่องจากฉันไม่สามารถทำอะไรได้หากไม่สามารถเข้าถึงวัตถุ shader นั้นได้

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


ทำไมไม่ส่งต่อข้อมูลไปยังผู้ให้บริการเมื่อถึงเวลาแสดง?
Nick Caplinger

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

คำตอบ:


11

ใช้บัฟเฟอร์แบบสม่ำเสมอ (เช่นบัฟเฟอร์คงที่ในศัพท์แสง D3D)

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

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

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

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

โปรดทราบว่าคุณต้องใช้ GL รุ่นที่ทันสมัยอยู่ในระดับปานกลางเพื่อใช้บัฟเฟอร์แบบสม่ำเสมอ (3.1 หรือส่วนขยายโดยทั่วไปเพียงพอในทุกวันนี้ยกเว้นในแล็ปท็อปรุ่นเก่า แต่ยังคงใช้งานอยู่) และคุณต้องการเวอร์ชั่นล่าสุด สามารถผูกบัฟเฟอร์เครื่องแบบไปยังตำแหน่งที่มีผลผูกพันเฉพาะจากภายในรหัส shader (4.2 ยังคงเป็นเรื่องแปลก แต่ดีขึ้น) มิฉะนั้นคุณต้องทำงานเพิ่มเติมในรหัสฝั่ง CPU ของคุณเพื่อตั้งค่าสิ่งต่าง ๆ (รหัส CPU ของคุณจำเป็นต้องรู้ผูกพันที่ถูกต้อง ให้คะแนนเลยดังนั้นมันจึงเป็นกลิ่นของ API มากกว่าปัญหาร้ายแรง) OpenGL | ES ไม่ได้เพิ่มบัฟเฟอร์แบบสม่ำเสมอจนกระทั่ง 3.0 ซึ่งยังไม่รองรับบนแพลตฟอร์มมือถือยอดนิยม

หากบัฟเฟอร์ไม่ใช่ตัวเลือกคุณจะต้องมีสถานที่ส่วนกลางบางแห่งในการจัดเก็บตำแหน่งดัชนีสำหรับ shader ที่ใช้งานอยู่ คุณสามารถใช้glGetUniformLocationหลังจากโหลด shader ของคุณเพื่อค้นหาดัชนีสำหรับชื่อที่รู้จักกันดี (เช่นModelViewMatrixหรือชอบ) จากนั้นจัดเก็บดัชนีเหล่านี้ การเรนเดอร์ของคุณสามารถแมปค่า enum เช่นMODEL_VIEWส่งไปยังSetUniformฟังก์ชัน wrapper เพื่อดูใน shader ที่ถูกผูกไว้ค้นหาดัชนีและโทรglUniformอย่างถูกต้อง มันไม่ใช่การเปลี่ยนแปลงครั้งใหญ่ในการใช้งานรหัสลูกค้าจากบัฟเฟอร์อื่น ๆ นอกเหนือจากการตั้งค่าชุดเครื่องแบบแต่ละชุดแยกกันหากคุณได้รับทุกอย่างเรียบร้อย

ดูGLSL inteface บล็อกและเครื่องแบบวัตถุบัฟเฟอร์


ฉันรู้ว่าพวกเขาจะเป็นแบบในตัว ขอบคุณ!
Lerp

4

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

วิธีที่ฉันทำในเกมของฉันคือฉันมีMaterialคลาสนามธรรม วัสดุที่ทำหน้าที่เป็นสะพานเชื่อมระหว่างเกมและ shaders แต่ละคนMaterialมีShaderและคุณสมบัติต่างๆที่สามารถตั้งค่ารวมทั้งพื้นผิว เมื่อถึงเวลาที่จะวาดวัตถุมันMaterialจะถูกผูกไว้ BindวิธีมีGraphicsStateพารามิเตอร์ที่มีทั้งหมดรัฐกราฟิกปัจจุบัน - เมทริกซ์, ไฟ ฯลฯBindวิธีการผูก Shader GraphicsStateและพื้นผิวและชุดเครื่องแบบทั้งหมดโดยใช้สิ่งที่มันต้องการจาก

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