ทำไมเราต้องการพิกัดที่สี่เพื่อหารด้วย z


12

ฉันอ่านคำตอบที่นี่:

กราฟิกการ์ดทำหน้าที่อย่างไรกับองค์ประกอบที่สี่ของเวกเตอร์เป็นตำแหน่งสุดท้าย

"องค์ประกอบที่สี่เป็นกลอุบายในการติดตามการฉายภาพเปอร์สเปคทีฟเมื่อคุณฉายภาพเปอร์สเปคทีฟคุณต้องการหารด้วย z: x '= x / z, y' = y / z แต่นี่ไม่ใช่การดำเนินการที่ สามารถดำเนินการได้โดยเมทริกซ์ 3x3 ที่ทำงานบนเวกเตอร์ของ x, y, z เคล็ดลับที่กลายเป็นมาตรฐานสำหรับการทำเช่นนี้คือการผนวกพิกัดที่สี่, w, และประกาศว่า x, y, z จะถูกหารด้วย w เสมอ หลังจากการแปลงทั้งหมดถูกนำไปใช้และก่อนการแรสเตอร์

แต่ฉันไม่เข้าใจว่าทำไมเราจึงหารด้วย z ด้วยเมทริกซ์ 3x3 ไม่ได้?

เราไม่สามารถคูณด้วย

1/z 0 0
0 1/z 0
0 0 1/z

เพื่อรับ [x/z y/z 1]

?


พยายามแสดงการแปลงสภาพ (หรือองค์ประกอบของการแปลงรูป) ที่มีการแปลอยู่ในโซ่ หากไม่มีค่า aw คุณจะไม่สามารถแสดงได้ในเมทริกซ์เดียว
DMGregory

ฉันเข้าใจส่วนการแปล แต่ฉันไม่เข้าใจว่าการเพิ่มพิกัดที่สี่จะช่วยหรือเป็นเคล็ดลับในการหารด้วย z

สำหรับสิ่งที่คุ้มค่าคุณสามารถทำสิ่งที่คุณพูดได้ การหาร x และ y ด้วย z เป็นวิธีที่ถูกต้องในการแปลงจากพิกัด 3 มิติไปเป็นพื้นที่หน้าจอ 2d พร้อมการฉายภาพที่วัตถุที่อยู่ห่างไกลจะเล็กลง w คือพิกัดที่เป็นเนื้อเดียวกันเพื่อนำไปสู่มิติที่สี่เพื่อให้สามารถทำการแปลได้
Alan Wolfe

คำตอบ:


14

เพราะถ้าคุณแบ่ง[x, y, z]โดยzคุณได้รับ[x/z, y/z, 1]และคุณสูญเสียมูลค่าที่แท้จริงของzซึ่งจะมีประโยชน์จริง ๆ ถ้าคุณต้องการที่จะทำการตัดระนาบใกล้ / ไกลหรือเติม Z-buffer

วิธีที่ดีที่สุดในการเก็บข้อมูลzอย่างน้อยเกี่ยวกับ GPU คือการใช้ 4 ส่วนประกอบแทน 3 ในทางปฏิบัติสิ่งที่เป็นจริงในองค์ประกอบเวกเตอร์สองอันสุดท้ายก่อนการแบ่งมุมมองขึ้นอยู่กับชนิดของการฉายภาพและเอฟเฟกต์ของคุณ ต้องการ.

ตัวอย่างเช่นในกรณีของการคาดการณ์มุมมองนี่คือเวกเตอร์ 4 องค์ประกอบที่เป็นผลลัพธ์:

| a 0 0 0 |   | x |   |   ax   |
| 0 b 0 0 |   | y |   |   by   |
| 0 0 c d | × | z | = | cz + d |
| 0 0 1 0 |   | 1 |   |    z   |

หลังจากมุมมองแบ่งเวกเตอร์กลายเป็น:

|  ax/z   |
|  by/z   |
| c + d/z |
|    1    |

และc + d/zส่วนทำให้เรามีข้อมูลเพียงพอที่จะเติมบัฟเฟอร์ Z


คุณสามารถแบ่งได้เฉพาะ X และ Y ด้วย Z ให้ผล [x / z, y / z, z] GPU ไม่จำเป็นต้องทำการแบ่งเวกเตอร์มันอาจถูกออกแบบมาเพื่อทำการคำนวณใด ๆ
user253751

3

ในทางเทคนิคคุณสามารถทำเช่นนั้นได้ แต่ทำไมตื๊อ เมื่อถึงเวลาสุดท้ายzคุณก็สามารถ:

  • สร้างเมทริกซ์ 3x3 ตามที่คุณอธิบายการสูญเสียจำนวน9 * sizeof(float)ไบต์ของพื้นที่ใช้วงจรในการคำนวณ1/z(ส่วนหนึ่ง) จากนั้นทำเก้าคูณและหกเพิ่มเพื่อเพิ่มจุดสุดยอดของคุณหรือ
  • คุณสามารถทำสามแผนกได้เช่นเดียวกับที่ทันสมัยในปัจจุบัน

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

พลัส, เมทริกซ์ 3x3 ไม่สามารถเข้ารหัสแปลและเมทริกซ์ 4x4 (และที่สี่wประสานงาน) ถูกนำมาใช้ก่อนหน้านี้ในท่ออยู่แล้ว ซึ่งหมายความว่าคุณมีส่วนประกอบที่สี่อยู่ในนั้นแล้วดังนั้นคุณสามารถใช้มันเพื่อขนส่งคุณค่าที่มีประโยชน์และทำการแบ่งของคุณด้วย

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