ใน OpenGL ฉันจะค้นหาช่วงความลึกของบัฟเฟอร์ความลึกได้อย่างไร


11

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

คำตอบ:


10

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

ค่าความลึก NDC (Z หลังจากมุมมองหารด้วย W) จะถูกปรับสัดส่วนตามส่วนความลึกของการแปลงวิวพอร์ต (ซึ่งนำพิกัด X และ Y ของคุณไปสู่พื้นที่พิกัดที่คุณเชื่อมโยงกับพิกเซลในหน้าต่าง) จากนั้นปรับขนาดด้วย(2^n-1)- นั่นหมายถึงการอ่านว่า "two to power of n" - nเป็นบิตความแม่นยำของบัฟเฟอร์ความลึก ค่าผลลัพธ์ถูกเขียนลงในบัฟเฟอร์ความลึก

OpenGL แยกความหมายของการเปลี่ยนแปลงเมทริกซ์วิวพอร์ตเข้าglViewportและglDepthRangeโทร glDepthRange เป็นสิ่งที่ควบคุมปัจจัยระดับความรับผิดชอบในการกำหนดช่วงความลึกที่คุณถาม คุณสามารถเรียกglGetFloatvพร้อมGL_DEPTH_RANGEตัวเลือกเพื่อกู้คืนช่วงปัจจุบัน สิ่งนี้จะช่วยให้คุณสามารถใช้ช่วงโดยไม่ต้องสมมติว่าเป็น 0 ถึง 1 (ถึง 99.9% ของเวลาในทางปฏิบัติไม่มีใครเปลี่ยนแปลงเลย)

อ่านเพิ่มเติมหากคุณต้องการความเข้าใจในการสร้างคณิตศาสตร์ใหม่เพื่อติดตามค่า Z ไปตลอดตั้งแต่พื้นที่ตาไปจนถึงบัฟเฟอร์ความลึก


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

7

ค่าในบัฟเฟอร์ความลึกจะอยู่ในช่วงระหว่าง 0-1 เสมอ ศูนย์คือชิ้นส่วนที่เรนเดอร์อยู่ในระดับความลึกของระนาบใกล้และ 1 คือส่วนที่อยู่ในระดับความลึกของระนาบไกล และทุกสิ่งระหว่างนั้น

หากคุณต้องการทราบความลึกที่แท้จริงในอวกาศโลกมันเป็นเรื่องง่ายที่จะคำนวณจากความลึกของบัฟเฟอร์

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

และนั่นคือเหตุผลที่คุณระบุระนาบใกล้และไกลในเครื่องฉายภาพของคุณเพื่อเพิ่มความแม่นยำของบัฟเฟอร์ความลึก

ระวังความแตกต่างระหว่างความลึกและระยะทางเมื่อใช้ค่าบัฟเฟอร์ความลึก


@notebene เกือบจะมี. ฉันต้องการลดช่วงของค่าในความลึกของบัฟเฟอร์ให้เท่ากับ 0 -> 1 ดังนั้นหากค่าความลึกต่ำสุด / สูงสุดที่แสดงผลเป็น. 25 / .75 ฉันต้องการ (ความลึก - .25) / (. 75 - .25) ดังนั้นจะมีวิธีการที่จะค้นพบนาที / สูงสุด depthbuffer ต่อไปนี้ผ่าน 1 และการใช้งานที่ rescale ในช่วงที่ผ่าน 2.
dugla

1
@dugla: เนื่องจากคุณเรนเดอร์สามเหลี่ยมซึ่งเป็นภาพถ่ายจากนั้นจึงบังคับให้ค่าความลึกต่ำสุดและสูงสุดจะสัมพันธ์กับจุดยอดต่ำสุดและสูงสุดในฉาก หากคุณรู้สองสิ่งนี้คุณสามารถเปลี่ยนมันเองได้ตลอดทางผ่านไปป์ไลน์และคุณจะรู้ว่าค่าต่ำสุดและค่าสูงสุดที่คุณจะเขียนลงในบัฟเฟอร์ความลึก นี่อาจจะง่ายกว่าการเรนเดอร์จากนั้นอ่านบัฟเฟอร์ความลึกทั้งหมดและวนซ้ำ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.