มูลนิธิ: นําเสนอพื้นที่ 3 มิติ
ก่อนที่พิกเซลเดียวจะวาด เครื่องยนต์ 3 มิติ ต้องเป็นภาษาทางคณิตศาสตร์ในการอธิบายวัตถุในพื้นที่ แกนหลักคือ [FLT: 0] เว็บ (FLT: 1) (FLT: 1) (3 พิกเซลแสดงตําแหน่ง, ทิศ, หรือสี) และmatric (4x4อาร์เรย์ที่เข้ารหัส) ใน C โดยทั่วไปแล้ว จะนิยามแบบง่าย:
- [FLT: 0] สําหรับจุดและเวกเตอร์
- สําหรับการแปลงเมทริกซ์ เก็บอยู่ในลําดับคอลัมน์หลัก
ทุกวัตถุประกอบด้วย [FLT: 0] สี่เหลี่ยม [FLT: 1) สามเหลี่ยมนิยามโดยสามเวอร์ติชัน แต่ละตําแหน่งจะระบุตําแหน่ง และตัวเลือกอื่น ๆ ที่ปกติและสี สโตงเหล่านี้เป็นอาร์เรย์แบบต่อเนื่อง (เช่น (FT:2) เพื่อเพิ่มประสิทธิภาพในครอบครอง 3 ลูก -- พิจารณาเมื่อ คุณประมวลผลหลายพันล้านหน้าต่อเฟรม ต่อมา
ภาพ ถ่าย ทาง กราฟิก
ท่อส่งภาพแบบกราฟิกเป็นลําดับของขั้นตอนที่แปลงข้อมูลฉาก 3 มิติ เป็นภาพแบบ 2 มิติ ในกลไกที่โปรแกรมใช้งานพื้นฐาน คุณจัดแต่ละเวทีเอง ส่วนขั้นตอนหลักคือ:
- [FLT: 0] vertex prographing – ปรับใช้โมเดล, มุมมอง, และโปรเจคชัน
- [FLT: 0] การแปรรูป – แปลงสามเหลี่ยมให้กลายเป็นเศษ (จุดๆ).
- [FLT: 0] shaped – คํานวณสีของแต่ละชิ้นส่วนตามแสงและวัสดุ
- [FLT: 0] output mering - ผสมชิ้นส่วนกับบัฟเฟอร์กรอบ รวมทั้งการทดสอบความลึก
เครื่องยนต์เร่งอนุภาค (ใช้ OpenGL, Vulkan หรือ โดยตรง) ดําเนินการส่วนใหญ่ในขั้นตอนเหล่านี้บน GPU แต่ความเข้าใจเส้นทางซอฟต์แวร์นั้น ให้ความเข้าใจลึกซึ้งถึงวิธีการทํางานของ GPU ภายใต้ฝาครอบ
โพรเซสและแปลงโฉมของเวอร์เท็กซ์
ทุกจุดยอดเริ่มต้นใน [FLT: 0] สเปซ (ตําแหน่งภายใน: ) (ตําแหน่งที่สัมพันธ์กับวัตถุ) เพื่อดํารงตําแหน่งมันในโลก คุณใช้ [FLT: 2] เมทริกซ์ [FLT] [FT] แบบสร ที่เข้ารหัสระบบแปล, การหมุน และการจัดระบบ, การปรับขนาด (FLT: 4) ดูที่พิกัด [FLT: 4] รูปมุมโลก [FLT: 5] ขอบเขตแสงโลก เปลี่ยนแปลงพื้นที่ (ดูพื้นที่ [2] ล่าสุด [2] สืบค้นเมื่อ [2-6] – สืบค้นเมื่อ 2552-0-0] มุมของพื้นที่พิกัดพิกัดพิกัด (FT) เชื่อมต่อ (FTLTLLT) สแกนต [FLLTLLE] มุม(9] มุม(9] มุมของจอจอ หน้าจอจอ หน้าจอจอ หน้าจอจอ แสดงผล, มุมของจอ หน้าจอจอ หน้าจอจอ เชื่อมต่อ เชื่อมต่อ สแกนเดโลป (FTRatigigottigottigoration: (9FT) spectment:
ใน C, ฟังก์ชันการแปลงดูเหมือน:
- [FLT: 3] – ผลตอบแทนเป็น identity matrix
- [FLT: 4] - กําลังสร้างเมทริกซ์แปล.
- [FLT: 5] – หมุนรอบแกน x
- - คูณ 4x4 เมทริกซ์ด้วยเวกเตอร์ 4 eportment (พิกัดเอกพันธ์)
เครื่อง ขัด เงา จุดยอด เทียบ เท่า กับ เครื่อง พิมพ์ ซอฟต์แวร์ ที่ อยู่ เหนือ จุดยอด ทุก อัน, คูณ แต่ ละ ตัว ด้วย [FLT: 7], และ เก็บ ผล ไว้ ใน แผ่น จุดยอด ที่ เปลี่ยน แปลง.
การ วาง แผน: การ ถ่าย ภาพ กับ การ ถ่าย ภาพ
การประมาณนี้เป็นตัวควบคุมความลึกที่แสดงบนหน้าจอ [FLT: 0] การฉายภาพแบบ Perspect Expressive [FLT: 1) ทําให้วัตถุระยะไกลดูมีขนาดเล็กลง ทําให้เกิดความเป็นจริงขึ้น เมทริกซ์ของมันถูกสร้างจากสาขามุมมอง สัดส่วนภาพ ใกล้เคียงกับและภาพไกล ระนาบแบบคลาสสิคเกี่ยวข้องกับการแบ่งองค์ประกอบ x และ y โดย Z (หลังการคูณเมทริกซ์) ใน ค.ศ.
- เหนือขึ้นไป 2
[FLT: 0] โปรเจคชันโอรทโอรติกราฟฟิก รักษาเส้นขนานและง่ายกว่า ใช้กับเครื่องมือยูไอหรือ CAD (UI หรือ CAD) มันไม่ได้เกี่ยวข้องกับการแบ่งมุมมอง
การ เปลี่ยน รูป แบบ ชีวิต: การ เติม สามเหลี่ยม ให้ เต็ม
หลังจากการฉายภาพแล้ว คุณมีพิกัด 2 มิติของหน้าจอ (เช่น ตําแหน่งพิกเซล) และค่าความลึก (z) การแยกสามเหลี่ยมแต่ละอันเป็นส่วนย่อยๆ ที่ครอบคลุมพิกัด พิกเซล อัลกอริทึมคลาสสิกคือ [FLT: 0] การแปลงภาพแบบ [FLT: 1]:
- จัดเรียงทั้งสามของสามเหลี่ยม vertics โดย y-e.
- เดินลงขอบซ้ายและขวา คํานวณขอบเขต x สําหรับแต่ละสแกนไลน์
- สําหรับ แต่ ละ พิกเซล ใน ช่วง แนว นอน คํานวณ ความ ลึก ของ ชิ้น ส่วน โดย การ พุ่ง ข้าม สาม เหลี่ยม.
- ทําการทดสอบ [FLT: 0] [FLT: 1]: เปรียบเทียบ z ของชิ้นกับค่าที่อยู่ภายในบัฟเฟอร์ความลึก หากใกล้กว่านี้ ให้ปรับปรุงค่าบัฟเฟอร์ความลึก และคํานวณสีของชิ้นส่วน
การปรับโครงสร้างอัลกอริทึมแบบเดินขอบอย่างมีประสิทธิภาพใน C ต้องมีวงจรที่แน่นและใช้คณิตศาสตร์คงที่ เพื่อหลีกเลี่ยงการลอยเหนือหัว
การ กรีด และ การ กรีด ร้อง
เครื่องยนต์แบบแบนแบน ใช้สีต่อสามเหลี่ยม คํานวณจากหน้าปกติและแหล่งกําเนิดแสงเดียว เครื่องยนต์ [FLT: 0] แบบ Lamberian ให้ความเข้มของแสง: [FLT: 9] ใน C คุณคํานวณผลิตภัณฑ์ของสามเหลี่ยมสองขอบ (หลังจากเปลี่ยนความเข้มเป็นพื้นที่โลก) จากนั้นคูณความเข้มของแสงด้วยสีฐานสามเหลี่ยม
เพื่อเพิ่มความลึก, ใช้ [FLT: 0] Goourud shading [FLT: 1) (Ortex Stormals, cription crossipts, cription crossiption cross) หรือ Phaffle Shashing . – Per-TTT:3]. ล่าสุดต้องการตําแหน่งที่แปลงเป็นเส้นตรงและรูปแบบปกติ จากนั้นคํานวณแสงต่อชิ้นส่วนต่างๆ ราคาแพง แต่มีผลที่แพงกว่า
การ สร้าง เครื่อง ยนต์ ใน ซี: ขั้น ตอน ที่ ใช้ ได้ จริง
เรา จะ ทํา ให้ มี การ หมุน รอบ วง กลม ด้วย แสง ที่ พ่น ออก มา และ ส่อง ออก ไป บน หน้าต่าง ขนาด 640×480 พิกเซล.
ขั้น ที่ 1 – ตั้ง พิกเซล
กําหนดบัฟเฟอร์หน่วยความจําสําหรับเฟรมและความลึก: [FLT: 10] และ[FLT: 11] ล้างเฟรมบัฟเฟอร์เป็นสีดําและความลึกบัฟเฟอร์เป็น 1.0 (เครื่องบินเร็ว) แต่ละเฟรม
ขั้น ที่ 2 – กําหนด ข้อมูล ฉาก
สําหรับลูกบาศก์, หกหน้า (12 สามเหลี่ยม) ต้องการ 12x3 = 36 vertictes. เก็บมันไว้ในลําดับของโครงสร้างแบบมีตําแหน่ง (3 ลอย) และสี (3 ลอยสําหรับ RGB). กึ่งขอบ 8 ลูกบาศก์และหกสี ใช้ดัชนีบัฟเฟอร์เพื่อหลีกเลี่ยงการลากตัวเวอร์ติติก.
ขั้น ที่ 3 – ท่อ เปลี่ยน แปลง
แต่ละเฟรม คํานวณเมทริกซ์จําลองจากมุม (เช่น หมุน YY( เวลา) วิวของกล้องจากกล้องที่คงที่ที่มองที่จุดกําเนิด และเมทริกซ์โปรเจคเตอร์ โดยแยกมันให้เป็นเมทริกซ์ MVP ซิงเกิล: [FLT: 12] แปลงจุดยอดทุกอันโดยเพิ่ม [FTTT: 13] จากมุมมองให้หาร (divide x,y,z, w) เพื่อดูพิกัดปกติ (1+1) เพื่อใช้ในการแสดงผล: [FLT: [FL] [LT] [LT: 15] (C] Disctures for Serportation.
ขั้น ที่ 4 – กรีด ร้อง และ พับ
สําหรับสามเหลี่ยมแต่ละรูป ให้ใช้วิธีการสแกนเส้น โดยให้แต่ละพิกเซลเดิน ขอบเขตความลึก และปรับลดความเข้มของลวดลายให้พอดีกับลักษณะเฉพาะตัว เช่น ตําแหน่งพื้นที่โลก (สําหรับ Phong) หรือจุดยอดปกติ (สําหรับเครื่องหมาย direct scription elections) จงเขียนสีสุดท้ายไปยังเฟรมบัฟเฟอร์หากการทดสอบความลึกผ่าน
ขั้น ที่ 5 – แสดง
ใช้เครื่องหมาย siple (Simple line etium graphy lel) หรือ ห้องสมุดที่คล้ายกันในการสร้างหน้าต่างและ blit the februff. ตัวอย่างเช่น กับ FTIF2 [FLT: 17] ใน จากนั้น[FLT: 20] และ (FLT:21] ) แต่ละครั้ง
เส้นทางซอฟต์แวร์นี้ทํางานบน CPU ดังนั้น ประสิทธิภาพจึงจํากัด แค่สามเหลี่ยมไม่กี่พันสามเหลี่ยมต่อเฟรม เมื่อรู้สึกสบายแล้ว คุณสามารถแทนที่ชั้นของ rasterization ด้วย OpenGL ได้ ทําให้การโหลดงานหนักไปยัง GPU ในขณะที่รักษาการแปลงและเหตุผลของฉากใน C.
การ ปรับ ตั้ง เครื่อง ยนต์
เครื่องยนต์พื้นฐานช้า การจัดอันดับหลาย ๆ อย่างจําเป็นสําหรับการดําเนินงานแบบเรียลไทม์
- [FLT: 0] การตัดหน้ากลับ: ข้ามสามเหลี่ยมที่ปกติชี้ห่างจากกล้อง คํานวณพื้นที่ลงนามของสามเหลี่ยม (ใน 2D) หรือตรวจสอบดอทโปรดัคของใบหน้าปกติตามทิศทางมุมมอง
- [FLT: 0] Frustuum pulling: ทดสอบกล่องผูกของวัตถุที่ชนกับเครื่องบิน 6 ลําของมุมมองฟรัสเซีย ถ้าสมบูรณ์ข้างนอกข้ามทั้งวัตถุ
- [FLT: 0]. คํานวณแบบ Fixed-point: แทนที่การดําเนินการแบบลอยจุดด้วยเลขจํานวนเต็มในวงเรกซ์เรกซ์เรสเตชันแน่น ผู้ผลิตหลายเครื่องใช้ 16.16 จุดคงที่สําหรับ สแกนไลน์
- [FLT: 0] แคชแบบ Pre-Transporm:[FLT: 1) หลีกการเปลี่ยนจุดยอดเดิมหลายครั้ง โดยการเปลี่ยนเวอร์ติชันของเมชทั้งหมดหนึ่งครั้ง จากนั้นใช้อินดิชัน (incogs)
- [FLT: 0] Blocked februff:[FLT: 1) เขียนพิกเซลในหน่วยความจําลําดับ (ซ้าย-ขวา, บน-ล่าง) เพื่ออ่านข้อมูลแคชสูงสุด
เทคนิค เหล่า นี้ สามารถ ผลัก ดัน ผู้ ผลิต โปรแกรม จาก 31-25 ฟพ็อพ ถึง 60 เฟรม สําหรับ ฉาก ที่ มี ความ ซับ ซ้อน พอ สม ควร (เช่น สามเหลี่ยม บาง ร้อย ชิ้น).
การขยายเครื่องยนต์
เมื่อมีรากฐานที่แข็งตัว คุณสามารถเพิ่มคุณสมบัติได้เพิ่ม
- [FLT: 0] การโยง: เก็บภาพ 2D ภาพ และปรับพิกัด UV ข้ามสามเหลี่ยม ตัวกรองแบบไบไลน์สําหรับความเรียบ
- [FLT: 0] adwancing: เพิ่มจุดเน้นสเปกตรัม (Blind-Phong) อนุมาน – occloped หรือแม้กระทั่งแผนที่เงา
- [FLT: 0] ผู้จัดการ Scene: ใช้ octree หรือ BPS เพื่อตัดสินว่าวัตถุไหนมองเห็นได้อย่างรวดเร็ว
- [FLT: 0] ปฏิสัมพันธ์ผู้ใช้: จัดทําคีย์บอร์ดและเมาส์เพื่อโคจรรอบกล้องหรือเลือกวัตถุ
- [FLT: 0] Pipeline นามธรรม: ออกแบบระบบเงา: นิยามฟังก์ชันจุดยอดและชิ้นส่วนเป็นตัวชี้ของฟังก์ชัน เปิดใช้งานการแสดงผลแบบยืดหยุ่นโดยไม่ต้องคอมไพล์
ทรัพยากร และ การ อ่าน เพิ่ม เติม
เพื่อ ให้ ลึก ซึ้ง ยิ่ง ขึ้น ใน ความ เข้าใจ ของ คุณ จง สํารวจ ข้อ ความ คลาส สิก และ บท เรียน ทาง อินเทอร์เน็ต ซึ่ง ดล ใจ เครื่อง ยนต์ นี้:
- [FLT: 0] สตา พิกเซล – อธิบายการติดตามรังสี, การแยกรังสี และคณิตศาสตร์ (in-depth).
- [FLT: 0] Learn OpenGL – โมเดิร์น OpenGLTS เริ่มต้นด้วย "สามเหลี่ยม Hello" บทที่ 1 พ.ศ.
- [FLT: 0] Wikipedia: 3D โปรเจกชั่น - คณิตศาสตร์อย่างเป็นทางการหลังมุมมองและเมทริกซ์โครงสร้างโลก (พ.ศ.
การสร้างเครื่องยนต์ 3 มิติใน C เป็นพิธีกรรมของทางผ่านสําหรับกราฟิกโปรแกรมเมอร์ มันสอนคุณ ไม่เพียงการเขียนโค้ดที่มีประสิทธิภาพเท่านั้น แต่ยังสอนวิธีคิดใน 3 มิติ และเขียนระบบจัดการระบบจัดการแบบทดสอบการทํางานด้วย