วัตถุประสงค์ของปริมาณการดูเป็นที่ยอมรับคืออะไร?


15

ฉันกำลังเรียนรู้ OpenGL และไม่สามารถหาคำตอบสำหรับคำถามนี้ได้

หลังจากเมทริกซ์การฉายภาพถูกนำไปใช้กับพื้นที่มุมมองพื้นที่การดูเป็น "ปกติ" เพื่อให้จุดทั้งหมดอยู่ในช่วง [-1, 1] โดยทั่วไปจะเรียกว่า "ปริมาณมุมมองมาตรฐาน" หรือ "พิกัดอุปกรณ์ปกติ"

ในขณะที่ฉันได้พบแหล่งข้อมูลมากมายที่บอกฉันเกี่ยวกับสิ่งที่เกิดขึ้นฉันไม่เห็นอะไรเลยว่าทำไมมันถึงเกิดขึ้น

จุดประสงค์ของขั้นตอนนี้คืออะไร?

คำตอบ:


7

ที่สำคัญที่สุดคือมันจะแปลงคะแนนของคุณ (จุดยอด) จากพื้นที่โลก 3D เป็นพื้นที่หน้าจอ 2D

นั่นหมายความว่าหลังจากที่จุดยอดถูกคูณด้วยเมทริกซ์ X และ Y นี้ตำแหน่งบนหน้าจอ (ระหว่าง [-1, 1]) และ Z คือความลึก Z ใช้สำหรับบัฟเฟอร์ความลึกและระบุว่าจุดยอด (หรือส่วน) จากกล้องของคุณอยู่ใกล้ระนาบ

โปรเจคชั่นหมายความว่าจุดยอดที่อยู่ใกล้กับระนาบใกล้ยิ่งไกลจากกลางจอ -> สามเหลี่ยมใกล้กับกล้องมากขึ้นดูเหมือนว่าจะใหญ่กว่าที่อยู่ไกล และสิ่งนี้ขึ้นอยู่กับมุมมองของคุณ - คุณกำลังป้อนมันในบางฟังก์ชั่น createProjectMatrix หรือ createFrustum มันทำงานได้ดีเมื่อใช้กรรไกรตัดขนาดของกล้อง frustum และ vertices ของคุณให้เป็นลูกบาศก์หน่วย ค่าที่มากกว่า 1 และน้อยกว่า -1 จะไม่ถูกแสดง

ยังคงรักษาอัตราส่วนพิกเซลเพื่อให้พิกเซลสามารถเป็น sqaure นั่นเป็นเรื่องง่าย มันแค่ตัดกล้อง frustum เช่นนี้: หน้าจอที่กว้างขึ้น -> เฉือนแนวตั้งและทางกลับกัน

คำตอบง่ายๆ:
มันกำหนดกล้อง frustum ของคุณและเป็นสิ่งที่ดี:

  • ทำให้วัตถุที่อยู่ใกล้คุณดูใหญ่กว่าวัตถุที่อยู่ไกลจากคุณ
  • รักษาอัตราส่วนพิกเซล - ทุกคนชอบพิกเซลสี่เหลี่ยมใช่ไหม :)

ฉันไม่เห็นส่วนใดที่เขาถามว่าเมทริกซ์การฉายทำอะไร เขาดูเหมือนจะสงสัยว่าพิกัดอุปกรณ์ปกติสำหรับอะไร
Chris บอก Reinstate Monica

เมทริกซ์ฉายกำหนด frustum กล้อง แต่นี่ไม่ได้อธิบายเหตุผลที่มี [-1,1] เป็นปริมาณการดูที่เป็นที่ยอมรับ ทำไมไม่มี [-100,100] แทน
bobobobo

1
เพราะ 1 คือ "จำนวนสามัญมากกว่า" มากกว่า 100: D (0 เป็นเรื่องธรรมดามากขึ้น แต่ลูกบาศก์ 0x0x0 ไม่น่าสนใจมาก ... )
Ivan Kuckir

5

คำตอบนี้เป็นเวลานานหลังจากความจริง แต่เนื่องจากฉันพบนี้ใน google อาจจะยังคงช่วยใครบางคน ฉันแค่ต้องการชี้แจงว่า JasonD และ Notabene กำลังพูดอะไร: มันง่ายกว่ามากที่จะทำการคำนวณการตัด (คิดออกว่าคุณควรเห็นอะไรและคุณไม่ควรเห็นอะไรเพราะวิธีที่คุณมองอยู่ไกลแค่ไหน ect) .) แทนที่จะตรวจสอบว่าสิ่งต่าง ๆ ตัดกันระนาบบนขอบของมุมมอง frustum ของคุณคุณเพียงเปรียบเทียบ x, y, z ของทุกสิ่งกับ xMax, xMin, yMax, ect เนื่องจากคุณมีลูกบาศก์ มันซับซ้อนกว่านี้เล็กน้อยถ้าคุณต้องการมีเพียงบางส่วนที่จะแสดง แต่คณิตศาสตร์ก็ยังดีกว่าด้วยคิวบ์หน่วยมากกว่ากับ frustum

สองสิ่งที่ฉันพบว่าทำให้เข้าใจผิดในคำตอบอื่น ๆ :

- คุณไม่ได้ตัดด้านข้างออกจากมุมมอง frustum คุณกำลังแปรปรวนมันเป็นลูกบาศก์โดยใช้การแปลงเมทริกซ์ที่เป็นเนื้อเดียวกัน

- เราไม่ได้แปลงเป็นหน้าจอ 2D ด้วยขั้นตอนนี้ ขั้นตอนนี้ไม่จำเป็นต้องทำ ในทางทฤษฎีเราสามารถทำงานทั้งหมดของเราได้โดยไม่ต้องแปลง frustum เป็น cube ก่อนซึ่งจะเป็นสัญชาตญาณที่ใช้งานง่ายขึ้น แต่คณิตศาสตร์ยากขึ้น แต่กราฟิคนั้นเกี่ยวกับการคำนวณที่รวดเร็วมากเนื่องจากมีการคำนวณจำนวนมากต่อวินาทีสำหรับเกมเฉลี่ย / อะไรก็ตาม

รายละเอียดเพิ่มเติม: ไม่จำเป็นต้องเป็นหน่วยลูกบาศก์ที่เราแปลงไปมันแค่ต้องเป็นกล่องสี่เหลี่ยมสำหรับการคำนวณค่าสูงสุดขั้นต่ำของเราในการคำนวณ ในความเป็นจริงในชั้นเรียนเราใช้กล่องที่กล้องหันแกน z ลง z ไปจาก 0 ถึง 1, x เปลี่ยนจาก -1 เป็น 1 และ y เพิ่มจาก -1 เป็น 1 โดยทั่วไปในคณิตศาสตร์ 1, 0, และ -1 เป็นตัวเลขที่ดีสำหรับการคำนวณง่ายขึ้นฉันคิดว่านั่นเป็นสาเหตุที่เราไม่ไปจาก -100 ถึง 100 หรืออะไรทำนองนั้น

TLDR: มันทำให้การตัดง่ายขึ้น

แก้ไข: bobobobo มีส่วนสำคัญของมัน โดยทั่วไปแล้วทุกอย่างเป็นรูปสามเหลี่ยม: D

ที่มา: การเรียนกราฟิกมหาวิทยาลัย


ในขณะที่น่าสนใจดูเหมือนว่าคะแนนของคุณเป็นจริงบางส่วน คุณไม่ได้ใช้เมทริกซ์เอกพันธ์มันเป็นเพียงแค่ว่าในพื้นที่คลิปจุดที่ถูกกำหนดในพื้นที่ที่เป็นเนื้อเดียวกัน 2) จริงใน ponts พื้นที่คลิปยังไม่ได้ฉายลงบนหน้าจอ มันเกิดขึ้นหลังจากมุมมองของการแบ่งแม้ว่าโปรดทราบว่าสิ่งนี้จะเกิดขึ้นเมื่อคุณกลับจากพื้นที่คลิปกลับไปยังพื้นที่คาร์ทีเซียน 3) ใช่และไม่ใช่ การแปลงจุดพิกัดไปยังพื้นที่ NDC ยังคงเป็นสิ่งที่จำเป็น สิ่งที่ไม่จำเป็นคือพื้นที่คลิปซึ่งใช้เฉพาะกับ GPU ...
user18490

... มันเป็นพื้นที่คลิปที่ไม่จำเป็นไม่ใช่การแมปกับคิวบ์ยูนิต สมมติฐานสุดท้ายของคุณไม่ถูกต้องเช่นกัน คุณทำการแมปใหม่เป็น 1 ถึง 1 เนื่องจากง่ายกว่าที่จะเปลี่ยนจากพื้นที่ NDC ไปเป็นพื้นที่แรสเตอร์ (การแปลงวิวพอร์ต) จริง ๆ แล้วมันง่ายยิ่งขึ้นถ้าคุณมีพื้นที่ NDC อยู่ในช่วง [0,1] ซึ่งเป็นกรณีสำหรับการใช้งานบางอย่าง ในตอนท้ายมันเป็นคณิตศาสตร์ทั้งหมดดังนั้นจึงมั่นใจได้ว่าจะสามารถใช้การประชุมอื่นได้ ดูเว็บไซต์ scratchapixel ที่ดีสำหรับรายละเอียดเพิ่มเติม
user18490


1

ฉันเชื่อว่าเป็นเพราะ OpenGL ไม่สามารถตั้งสมมติฐานเกี่ยวกับวิธีการแสดงภาพ (อัตราส่วนภาพหรือความละเอียดรายละเอียดฮาร์ดแวร์ ฯลฯ ) มันแสดงผลและภาพในรูปแบบกลางซึ่งระบบปฏิบัติการหรือไดรเวอร์หรืออะไรก็ตามที่ปรับขนาดให้เป็นความละเอียด / ขนาดที่ถูกต้อง


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

ไม่จำเป็นต้องรู้อัตราส่วนหรือไม่ จากสิ่งที่ฉันเข้าใจมันจัดเก็บปัจจัยการปรับสเกลของ X และ Y เพื่อให้ภาพมีอัตราส่วนภาพที่ถูกต้องในภายหลัง
breadjesus

3
แก้ไขให้ถูกต้องถ้าฉันผิด แต่เขากำลังพูดถึงหลังจากที่คุณฉายจุดและทำให้เรากำลังพูดถึง 2D หากเป็นกรณีนี้ OpenGL จะไม่ทราบว่าคุณวางภาพนี้ไว้ที่ใดบนหน้าจอ มันสร้างภาพซึ่งง่ายต่อการปรับขนาดและวางอย่างถูกต้อง แต่มันไม่ได้ทำเพื่อคุณ ฉันยอมรับว่ารายละเอียดฮาร์ดแวร์เป็นชื่อที่ไม่ดีสำหรับฉันฉันหมายถึงข้างต้น นอกจากนี้คุณสามารถระบุเมทริกซ์การฉายด้วยอัตราส่วนภาพได้ แต่อัตราส่วนนั้นไม่จำเป็นต้องเหมือนกับจอภาพของคุณ
Chewy Gumball

3
ฉันต้องบอกว่าฉันสนุกกับการสนทนานี้จริงๆ คุณอยู่ใกล้จะถูก ให้ลึกยิ่งขึ้น ไม่มีรูปภาพหลังจากจุดยอดการคูณด้วย projMat ผลลัพธ์เป็นเพียงชุดของจุด 2 มิติที่มีความลึก กว่าที่จะเริ่มต้นการสร้างภาพใหม่และสร้างภาพ (ถ้าบน cpu มันจะวาดเส้นระหว่างสามเหลี่ยม verts และเติมมัน (และแรเงามัน - อะไรก็ตาม) ... บน gpu จะถูกดำเนินการก่อน pixel / shader ส่วน) และอัตราส่วนจะกำหนดจุดที่ควร "ลดขนาด" เป็นค่าที่มากกว่า 1 หรือเล็กกว่า -1 และจะไม่แสดง
Notabene

2
Ahhh! ฉันเห็นปัญหาที่นี่ เขากล่าวว่า "โดยทั่วไปจะเรียกว่า" ปริมาณมุมมองมาตรฐาน "หรือ" พิกัดอุปกรณ์ปกติ " ฉันกำลังตอบราวกับว่าเขากำลังถามเกี่ยวกับพิกัดอุปกรณ์ปกติ แต่เขาไม่ได้ถามจริงเกี่ยวกับสิ่งเหล่านั้นเลย ในความเป็นจริงพวกเขามีสองสิ่งที่แตกต่างอย่างสิ้นเชิงและนั่นคือเหตุผลที่เราอยู่ที่นี่ บางทีนั่นควรจะมีการชี้แจงเพื่อให้ผู้คนไม่ทำผิดแบบเดียวกันกับที่ฉันทำ
Chewy Gumball

1

ฉันทราบคำตอบที่ได้รับการยอมรับแล้ว แต่โดยทั่วไปแล้วมันมีประโยชน์สำหรับการตัดให้มุมมอง frustum เปลี่ยนเป็นลูกบาศก์หน่วย


จริงฉันแก้ไขคำตอบของฉันเล็กน้อยเพื่อให้ชัดเจนยิ่งขึ้นเกี่ยวกับเรื่องนี้
Notabene

โดยวิธีหน่วยลูกบาศก์เป็นลูกบาศก์ด้าน 1 ดังนั้นชื่อไม่เหมาะสม ควรเรียกว่าระดับการรับชมที่ยอมรับได้แทน
user18490

1

ฉันก็สงสัยเช่นกัน มีสองสิ่งที่ควรพิจารณา

อันดับแรกใช่ทุกอย่างในโลกจะถูกแปลงเป็นลูกบาศก์หน่วยนั้น [-1,1] อยู่กึ่งกลางแหล่งกำเนิด หากบางสิ่งไม่อยู่ในคิวบ์หน่วยนั้นจะไม่ปรากฏขึ้น

สิ่งที่ดีเกี่ยวกับเรื่องนี้คือตอนนี้คุณสามารถเลือกรูปสามเหลี่ยมได้ง่ายๆ (หากจุดยอดทั้งสามของสามเหลี่ยมมีx > 1หรือx < -1ว่าสามเหลี่ยมนั้นสามารถเลือกได้)


0

ฉันอยากจะแนะนำให้ตรวจสอบบทเรียนเกี่ยวกับเมทริกซ์มุมมองการฉายใน Scratchapixel

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

มันอธิบายได้อย่างชัดเจนว่าทำไมการบิดพื้นที่ frustum ของมุมมองไปยังหน่วย cube ทำไม? เป็นหลักเนื่องจากกระบวนการของการฉายจุด 3 มิติบนผืนผ้าใบที่เกี่ยวข้องกับการแปลงพื้นที่ NDC ซึ่งเป็นพื้นที่ที่มีการแมปจุดบนหน้าจอใหม่ในช่วง [-1,1] (สมมติว่าหน้าจอเป็นสี่เหลี่ยมจัตุรัส) ทีนี้เราก็ทำการแมปจุดพิกัด Z เข้ากับช่วง [0,1] (หรือบางครั้ง [-1,1]) ดังนั้นในที่สุดคุณก็จบลงด้วยลูกบาศก์ ความจริงก็คือเมื่อมีคะแนนอยู่ในคิวบ์มันง่ายกว่าที่จะประมวลผลพวกเขากว่าเมื่อพวกเขาถูกกำหนดในมุมมอง frustrum (ซึ่งเป็นพื้นที่แปลกประหลาดปิรามิดที่ถูกตัดทอน) อีกเหตุผลหนึ่งก็คือมันทำให้เกิดการแปลงโปรเจคทุกประเภทที่คุณสามารถจินตนาการได้ใน CG ไปยังพื้นที่เดียวกัน (หน่วยลูกบาศก์ของสิ่ง) ดังนั้นไม่ว่าคุณจะใช้เปอร์สเปคทีฟหรือการฉายภาพ orthographic

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

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