กลับไปหน้าบทความ

อ่าน 7 นาที

การบัฟเฟอร์ Z

บัฟเฟอร์ Z หรือที่เรียกว่า บัฟเฟอร์ความลึก เป็น บัฟเฟอร์ข้อมูล ชนิดหนึ่งที่ใช้ใน กราฟิกคอมพิวเตอร์ เพื่อจัดเก็บข้อมูลความลึกของชิ้นส่วนต่างๆ...

การบัฟเฟอร์ Z

( เรียนรู้วิธีและเวลาในการลบข้อความนี้ )
ข้อมูลบัฟเฟอร์ Z

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

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

Z-buffering เป็นเทคนิคที่ใช้ในคอมพิวเตอร์ โน้ตบุ๊ก และโทรศัพท์มือถือเกือบทุกเครื่องในปัจจุบัน เพื่อสร้างกราฟิกคอมพิวเตอร์ 3 มิติการใช้งานหลักในปัจจุบันคือในวิดีโอเกมซึ่งต้องการการประมวลผลฉาก 3 มิติที่รวดเร็วและแม่นยำ

การใช้งาน

การอุดตัน

การกำหนดว่าอะไรควรแสดงบนหน้าจอและอะไรควรละเว้นนั้นเป็นกระบวนการหลายขั้นตอนที่ใช้เทคนิค ต่างๆ การใช้ z-buffer เป็นขั้นตอนสุดท้ายในกระบวนการนี้

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

ความละเอียดของบัฟเฟอร์ Z มีผลอย่างมากต่อคุณภาพของภาพ: บัฟเฟอร์ Z แบบ 16 บิต แบบดั้งเดิมอาจทำให้เกิด สิ่งผิดปกติ (เรียกว่า " z-fighting " หรือ " การต่อภาพ ") เมื่อวัตถุสองชิ้นอยู่ใกล้กันมาก บัฟเฟอร์ Z แบบ 24 บิตหรือ32 บิต ที่ทันสมัยกว่านั้น ทำงานได้ดีกว่ามาก แม้ว่าปัญหาจะไม่สามารถแก้ไขได้โดยปราศจากอัลกอริทึมเพิ่มเติม บัฟเฟอร์ Z แบบ 8 บิตแทบจะไม่ถูกใช้เลยเนื่องจากมีความแม่นยำน้อยเกินไป

การแมปเงา

ข้อมูล Z-buffer ที่ได้จากการเรนเดอร์พื้นผิวจากมุมมองของแสงช่วยให้สามารถสร้างเงาได้ด้วยเทคนิคการแมปเงา[ 1 ]

ประวัติศาสตร์

Z-buffering ได้รับการอธิบายครั้งแรกในปี 1974 โดย Wolfgang Straßer ในวิทยานิพนธ์ปริญญาเอกของเขาเกี่ยวกับอัลกอริธึมที่รวดเร็วสำหรับการเรนเดอร์วัตถุที่ถูกบดบัง[ 2 ]วิธีแก้ปัญหาที่คล้ายกันในการกำหนดรูปหลายเหลี่ยมที่ทับซ้อนกันคืออัลกอริธึมของจิตรกรซึ่งสามารถจัดการกับองค์ประกอบฉากที่ไม่ทึบแสงได้ แม้ว่าจะต้องแลกมาด้วยประสิทธิภาพที่ลดลงและผลลัพธ์ที่ไม่ถูกต้องก็ตาม

โดยทั่วไปแล้ว Z-buffer มักถูกนำไปใช้ในฮาร์ดแวร์ภายในกราฟิกการ์ด สำหรับผู้บริโภค นอกจากนี้ Z-buffering ยังถูกนำมาใช้ (ในรูปแบบซอฟต์แวร์แทนที่จะเป็นฮาร์ดแวร์) ในการสร้างเอฟเฟกต์พิเศษที่สร้างด้วยคอมพิวเตอร์สำหรับภาพยนตร์

การพัฒนา

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

เมื่อเริ่มต้นฉากใหม่ บัฟเฟอร์ z จะต้องถูกล้างให้เป็นค่าที่กำหนดไว้ โดยปกติคือ 1.0 เนื่องจากค่านี้เป็นขีดจำกัดบน (ในมาตราส่วน 0 ถึง 1) ของความลึก ซึ่งหมายความว่าไม่มีวัตถุใดปรากฏอยู่ที่จุดนี้ภายในขอบเขตการมองเห็น

โดยทั่วไปแล้ว การคิดค้นแนวคิด z-buffer มักถูกยกให้เป็นผลงานของEdwin Catmullแม้ว่า Wolfgang Straßer จะได้อธิบายแนวคิดนี้ไว้ในวิทยานิพนธ์ปริญญาเอกของเขาในปี 1974 หลายเดือนก่อนที่ Catmull จะคิดค้นก็ตาม[ a ]

ในกราฟิกการ์ดพีซีรุ่นใหม่ๆ (ปี 1999–2005) การจัดการ z-buffer ใช้แบนด์วิดท์หน่วย ความจำจำนวนมาก จึงมีการใช้วิธีการต่างๆ เพื่อลดต้นทุนด้านประสิทธิภาพของ z-buffering เช่นการบีบอัดแบบไม่สูญเสียข้อมูล (ทรัพยากรคอมพิวเตอร์ในการบีบอัด/คลายการบีบอัดมีราคาถูกกว่าแบนด์วิดท์) และการล้าง z-buffer ด้วยฮาร์ดแวร์ที่เร็วมาก ซึ่งทำให้เทคนิค "หนึ่งเฟรมบวก หนึ่งเฟรมลบ" ล้าสมัยไป (โดยการข้ามการล้างระหว่างเฟรมทั้งหมดโดยใช้ตัวเลขที่มีเครื่องหมายเพื่อตรวจสอบความลึกอย่างชาญฉลาด)

เกมบางเกม โดยเฉพาะเกมหลายเกมในช่วงหลังของ วงจรชีวิตของ Nintendo 64ตัดสินใจที่จะลดการใช้ z-buffering ให้น้อยที่สุด (เช่น การเรนเดอร์พื้นหลังก่อนโดยไม่ใช้ z-buffering และใช้ z-buffering เฉพาะกับวัตถุที่อยู่ด้านหน้าเท่านั้น) หรือละเว้นการใช้ z-buffering ไปโดยสิ้นเชิง เพื่อลดความต้องการแบนด์วิดท์หน่วยความจำและความต้องการหน่วยความจำตามลำดับSuper Smash Bros.และF-Zero Xเป็นสองเกมของ Nintendo 64 ที่ลดการใช้ z-buffering เพื่อเพิ่มอัตราเฟรม เกมของ Factor 5หลายเกมก็ลดหรือละเว้นการใช้ z-buffering เช่นกัน บน Nintendo 64 การใช้ z-buffering สามารถใช้แบนด์วิดท์ได้มากถึง 4 เท่าเมื่อเทียบกับการไม่ใช้ z-buffering [ 3 ]

Mechwarrior 2บนพีซีรองรับความละเอียดสูงสุด 800 × 600 [ 4 ] บน 3dfx Voodoo ขนาด 4 MB ดั้งเดิมเนื่องจากไม่ได้ใช้ z-buffering

การคัดกรอง Z

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

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

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

  • รูปหลายเหลี่ยมที่บดบังกันเป็นวงจร (เช่น สามเหลี่ยม A บดบัง B, B บดบัง C, C บดบัง A)
  • การที่ไม่มีจุด "ใกล้ที่สุด" ที่เป็นมาตรฐานบนรูปสามเหลี่ยม (กล่าวคือ ไม่ว่าเราจะเรียงลำดับรูปสามเหลี่ยมตามจุดศูนย์กลางจุดที่ใกล้ที่สุด หรือจุดที่ไกลที่สุด เราก็สามารถหารูปสามเหลี่ยม A และ B ได้เสมอ โดยที่ A นั้น "ใกล้กว่า" แต่ในความเป็นจริงแล้วควรวาดรูป B ก่อน)

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

คณิตศาสตร์

ช่วงค่าความลึกในพื้นที่กล้องที่จะแสดงผลมักถูกกำหนดไว้ระหว่างค่า a และค่าของ.

หลังจากการแปลงมุมมองค่าใหม่ของหรือจะถูกกำหนดโดย:

หลังจากฉายภาพแบบออร์โธกราฟิกแล้ว ค่าใหม่ของหรือจะถูกกำหนดโดย:

ค่าเดิมของ ในพื้นที่กล้องอยู่ ที่ไหนและบางครั้งเรียกว่า หรือ

ค่าที่ได้จะถูกปรับให้เป็นค่ามาตรฐานระหว่าง –1 และ 1 โดยที่ระนาบอยู่ที่ –1 และระนาบอยู่ที่ 1 ค่าที่อยู่นอกช่วงนี้จะสอดคล้องกับจุดที่อยู่นอกขอบเขต การมองเห็น และไม่ควรแสดงผล

การแสดงผลแบบจุดคงที่

โดยทั่วไป ค่าเหล่านี้จะถูกเก็บไว้ในบัฟเฟอร์ z ของตัวเร่งกราฟิกฮาร์ดแวร์ใน รูปแบบ จุดคงที่ ก่อน อื่น ค่าเหล่านี้จะถูกแปลงให้เป็นช่วงที่ใช้กันทั่วไปมากขึ้น ซึ่งคือ[0, 1]โดยการแทนที่การแปลงที่เหมาะสมลงในสูตรก่อนหน้า:

โดยสรุป:

ประการที่สอง สูตรข้างต้นจะถูกคูณด้วย โดยที่ d คือความลึกของบัฟเฟอร์ z (โดยปกติคือ 16, 24 หรือ 32 บิต) และปัดเศษผลลัพธ์ให้เป็นจำนวนเต็ม: [ 5 ]

สูตรนี้สามารถกลับด้านและหาค่าได้เพื่อคำนวณความละเอียดของบัฟเฟอร์ z (หรือ "ระดับความละเอียด" ที่กล่าวถึงก่อนหน้านี้) ส่วนกลับของสูตรข้างต้นคือ:

ที่ไหน

ความละเอียดของบัฟเฟอร์ z ในแง่ของพื้นที่กล้องจะเป็นค่าเพิ่มขึ้นที่ได้จากการเปลี่ยนแปลงน้อยที่สุดในจำนวนเต็มที่เก็บไว้ในบัฟเฟอร์ z ซึ่งก็คือ +1 หรือ –1 ดังนั้น ความละเอียดนี้สามารถคำนวณได้จากอนุพันธ์ของเป็นฟังก์ชันของ:

เมื่อแสดงกลับมาในแง่ของพื้นที่กล้อง โดยแทนที่ด้วยสิ่งข้างต้น:

สิ่งนี้แสดงให้เห็นว่าค่าของถูกจัดกลุ่มอย่างหนาแน่นมากขึ้นใกล้ระนาบ และกระจัดกระจายมากขึ้นเมื่ออยู่ไกลออกไป ส่งผลให้มีความแม่นยำมากขึ้นเมื่ออยู่ใกล้กล้อง ยิ่งมีค่าน้อยความแม่นยำก็จะยิ่งน้อยลงเมื่ออยู่ไกลออกไป การตั้งระนาบไว้ใกล้เกินไปเป็นสาเหตุทั่วไปของการเกิดสิ่งผิดปกติในการแสดงผลที่ไม่พึงประสงค์ในวัตถุที่อยู่ไกลออกไป[ 6 ]

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

บัฟเฟอร์ W

ในการใช้งาน w-buffer [ 7 ]ค่าเก่าของในพื้นที่กล้อง หรือจะถูกเก็บไว้ในบัฟเฟอร์ โดยทั่วไปใน รูป แบบจุดลอยตัวอย่างไรก็ตาม ค่าเหล่านี้ไม่สามารถประมาณค่าเชิงเส้นข้ามพื้นที่หน้าจอจากจุดยอดได้ โดยปกติแล้วจะต้องกลับค่า ประมาณค่าแล้วกลับค่าอีกครั้ง ค่าที่ได้ของเมื่อเทียบกับจะมีระยะห่างเท่าๆ กันระหว่างและมีการใช้งาน w-buffer ที่หลีกเลี่ยงการกลับค่าทั้งหมด

การใช้ z-buffer หรือ w-buffer จะให้ภาพที่ดีกว่ากันนั้น ขึ้นอยู่กับแอปพลิเคชันที่ใช้งาน

อัลกอริทึมมิกส์

รหัสเทียมต่อไปนี้แสดงขั้นตอนการสร้างบัฟเฟอร์ z:

// ขั้นแรก ให้กำหนดค่าความลึกเริ่มต้นให้กับแต่ละพิกเซล d(i, j) = อนันต์ // ความยาวสูงสุด // กำหนดค่าสีเริ่มต้นให้กับแต่ละพิกเซลเป็นสีพื้นหลัง c(i, j) = สีพื้นหลัง // สำหรับรูปหลายเหลี่ยมแต่ละรูป ให้ทำตามขั้นตอนต่อไปนี้: สำหรับ (แต่ละพิกเซลในการฉายภาพของรูปหลายเหลี่ยม) {     // หาค่าความลึก เช่น ค่า z ของรูปหลายเหลี่ยม     // ที่ตำแหน่ง (x, y) ซึ่งตรงกับพิกเซล (i, j)        ถ้า (z < d(i, j))     {         d(i, j) = z;         c(i, j) = สี;     } } 

ดูเพิ่มเติม

  • เรียนรู้ที่จะรัก Z-buffer ของคุณ
  • การผสมอัลฟาและบัฟเฟอร์ Z

หมายเหตุ

  1. ดูโวล์ฟกัง เค. กิลอย , เจแอล เอนการ์นาเซา, ดับเบิลยู. สตราเซอร์ "โรงเรียนคอมพิวเตอร์กราฟิกกิลอย" คอมพิวเตอร์กราฟฟิก 35 4:12–16.
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Z-buffering&oldid=1345651183 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การบัฟเฟอร์ Z

บัฟเฟอร์ Z หรือที่เรียกว่า บัฟเฟอร์ความลึก เป็น บัฟเฟอร์ข้อมูล ชนิดหนึ่งที่ใช้ใน กราฟิกคอมพิวเตอร์ เพื่อจัดเก็บข้อมูลความลึกของชิ้นส่วนต่างๆ...

การอุดตัน

การกำหนดว่าอะไรควรแสดงบนหน้าจอและอะไรควรละเว้นนั้นเป็นกระบวนการหลายขั้นตอนที่ใช้ เทคนิค ต่างๆ การใช้ z-buffer เป็นขั้นตอนสุดท้ายในกระบวนการนี้

การแมปเงา

ข้อมูล Z-buffer ที่ได้จากการเรนเดอร์พื้นผิวจากมุมมองของแสงช่วยให้สามารถสร้างเงาได้ด้วยเทคนิค การแมปเงา [ 1 ]

ประวัติศาสตร์

Z-buffering ได้รับการอธิบายครั้งแรกในปี 1974 โดย Wolfgang Straßer ในวิทยานิพนธ์ปริญญาเอกของเขาเกี่ยวกับอัลกอริธึมที่รวดเร็วสำหรับการเรนเดอร์วัตถุที่ถูกบดบัง [ 2 ] วิธีแก้ปัญหาที่คล้ายกันในการกำหนดรูปหลายเหลี่ยมที่ทับซ้อนกันคือ อัลกอริธึมของจิตรกร...