Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

วิธี Z-Buffer หรือ Depth-Buffer ใน C++

Z-buffer หรือที่รู้จักในชื่อ depth-buffer เป็นวิธีการที่ใช้สำหรับการตรวจจับพื้นผิวที่ถูกบัง (hidden surface detection)

การตรวจจับพื้นผิวที่ถูกบัง

สำหรับภาพใดๆ ที่มีวัตถุและพื้นผิวที่โปร่งแสง ในกรณีนี้ วัตถุที่อยู่ด้านหลังวัตถุอื่นๆ จะถูกบัง เพื่อให้ได้ภาพที่ถูกต้อง เราจำเป็นต้องกำจัดพื้นผิวที่ถูกบังเหล่านี้ การระบุนี้เรียกว่า hidden surface problem

ใน z-buffer เราจะเปรียบเทียบพื้นผิวในแกน z เป็นความลึก (depth)

อัลกอริทึม

ขั้นตอนที่ 1: เริ่มต้นความลึกของพิกเซลทั้งหมดเป็นค่าสูงสุด d(i,j) = infinity
ขั้นตอนที่ 2: เริ่มต้นสีสำหรับพิกเซลทั้งหมด c(i,j) = background-color
ขั้นตอนที่ 3: สำหรับแต่ละพิกเซลในการฉายภาพของพอลิゴน ทำ
    ขั้นตอนที่ 3.1: หา z คือความลึกของพิกเซล (i,j) ของการฉายภาพ
    ขั้นตอนที่ 3.2: หาก z < d(i,j) ทำ
        ขั้นตอนที่ 3.2.1: d(i,j) = z และ c(i,j) = สีของพอลิ곤

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

z=0 คือ back clipping plane และ z=1 คือ front clipping plane

จุดสำคัญของ z-buffer

  • ไม่ต้องการการเรียงลำดับพอลิโกน (planes) ล่วงหน้าในการใช้วิธี z-buffer

  • Z-buffer ให้ผลลัพธ์รวดเร็วแม้จำนวน planes จะมาก

  • ไม่ต้องการการเปรียบเทียบวัตถุในวิธี z-buffer

  • วัตถุที่ถูกบังที่ไม่ใช่พอลิโกนก็สามารถตรวจจับได้ด้วยวิธีนี้

  • ไม่ต้องการโครงสร้างข้อมูลเพิ่มเติมสำหรับการจัดเก็บและแก้ไข

  • สามารถนำไปใช้ในฮาร์ดแวร์เพื่อเร่งกระบวนการ และใช้งานจริงในกราฟิกเวิร์กสเตชัน

  • วิธีนี้ใช้ได้เฉพาะเมื่อวัตถุที่พิจารณาเป็นทึบ (opaque) คือวัตถุโปร่งแสงอาจให้ข้อผิดพลาด

  • การวาดพื้นผิวที่ถูกบังอาจเป็นกระบวนการที่ใช้เวลานาน