Software Pampayag; Inhinyeriya sa Computer
Paggamit ng C Upang Magkaroon ng Pangunahing 3d Graphics
Table of Contents
Mga Pundasyon: Paglalarawan sa Tatlong-Dimensiyonal na Kalawakan
Bago iguhit ang isang pixel, ang isang 3D na makina ay dapat may isang matematikal na wika upang ilarawan ang mga bagay sa kalawakan. Sa core ay vectors (tatlong-komponenteng tuples na kumakatawan sa posisyon, direksiyon, o kulay) at ⁇ s (4×4 arrays na nagreresulta ng mga pagbabago). Sa C, ang mga ito ay karaniwang binibigyang kahulugan bilang mga simpleng struct:[2].
- para sa mga punto at vector.
- para sa mga transpormasyong maririce na nakaimbak sa kolum-major order.
Ang bawat bagay ay binubuo ng . Ang tatsulok ay binibigyang kahulugan ng tatlong bertiko, bawat isa ay may posisyon, at hindi sapilitan ang isang normal at kulay.Ang pag - aayos sa mga ito bilang mga magkakahanay na hanay (hal., para sa isang cube) ay nagpapabuti sa kahusayan ng cache compilvia sa kritikal na paraan kapag ikaw ay huling nag - iisip ng libu - libong mukha sa bawat balangkas.
Ang Graphics Pipeline: Mula sa Vertices Tungo sa Pixels
Ang graphics pipeline ay isang pagkakasunud-sunod ng mga yugto na binabago ang 3D scene data upang maging isang 2D image. Sa isang pangunahing software-provived engine, manu-mand na ipatupad mo ang bawat yugto. Ang mga pangunahing phase ay:
- Vertex Processitions – Paglalapat ng modelo, pananaw, at projection transpormasyon.
- [Rasterization – ginagawang pira-piraso ang mga tatsulok (potential pixels).
- – pagkukuwenta ng kulay ng bawat piraso batay sa liwanag at materyal.
- Output Merging – pagsasama ng mga piraso sa balangkas na lingugpuan, kabilang ang pagsubok sa lalim.
Ang mga makinang Hardware-accelerated (gamit ang OpenGL, Vulkan, o DirectX) ay nagsasagawa ng karamihan sa mga hakbang na ito sa GPU, ngunit ang pag-unawa sa landas ng software ay nagbibigay sa iyo ng malalim na kabatiran sa kung paano gumagana ang GPU sa ilalim ng kaputsa.
Pag - unlad at Pagbabago sa Vertex
Ang bawat vertex ay nagsisimula sa [[ (local coordinates may kaugnayan sa bagay). Upang maipuwesto ito sa daigdig, ang Ang model Maternity[ na nag-aayos ng pagsasalin, pag-ikot, at pag-ikot ay naglalapat ng sistema [[FL] [[FL]view Ang pandaigdig na nag-uugnayantas ng mga larawan (consect) at ng mga espasyo [[T][T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T]
Sa C, ang mga gawain ng pagbabago ay parang:
- – ibalik ang isang identity material.
- – gumawa ng isang transaksyong material.
- – iikot sa X axis.
- – ay nagpaparami ng 4×4 na matrix ng isang 4-elemental na vector (homogeneous coordinates).
Ang vertex underer na katumbas sa software na inere sa lahat ng vertices, ay dumarami bawat isa sa pamamagitan ng pinagsamang material, at nag - iimbak ng resulta sa isang binagong vertex liver.
Projection: Perspective versus Ortograpiya
Ang Projection ang kumokontrol kung paano inilalarawan ang lalim sa screen. [[Perpective projection[ Ang mga malalayong bagay ay tila mas maliit, na lumilikha ng realismo. Ang material nito ay ginawa mula sa larangan ng pananaw, aspektong proporsiyon, malapit at malayo sa pagtabas ng mga eroplano. Ang klasikong pormula ay nagsasangkot ng paghahati ng x at y mga bahagi sa pamamagitan ng z (pagkatapos ng recombination). Sa C, minsangity mo pinag-tagnirecorded ang transition at muling ginagamit ito sa bawat frame:
- – ibalik ang isang pamantayang perspektibong material.
Iniingatan ng Orthographic projection ang magkahanay na mga linya at mas simple, na ginagamit para sa mga kasangkapang UI o CAD. Hindi ito kinasasangkutan ng perspektibong paghahati.
Rasterization: Pagpuno ng Triangle
Pagkatapos ng projection, mayroon kang 2D screen coordinate (katulad ng mga posisyon ng pixel) at isang deep na halaga (z).Batihin ng Rasterization ang bawat tatsulok sa mga piraso na sumasaklaw sa mga integer pixel coordinate. Ang klasikong algorithm ay [:
- Iuri ang triangle routes tatlong vertices sa pamamagitan ng y-coordinate.
- Ilakad ang kaliwa at kanang gilid, na tinatagpas ang mga hangganan ng x sa bawat scanline.
- Sa bawat pixel sa pahalang na span, kalkulahin ang lalim ng piraso sa pamamagitan ng pag - iikid sa tatsulok.
- Magsagawa ng depth test: ihambing ang mga stageiler z sa halaga na nasa glosses neutral. kung mas malapit, i-apdeyt ang deep liver at i-compute ang partible rightifics color.
Ang pag-implement sa gilid-paglalakad na algorithm na mahusay sa C ay nangangailangan ng mahigpit na mga presipitasyon at maingat na paggamit ng nakapirmeng-point na aritmetika upang maiwasan ang lumulutang-puntot na ibabaw. maraming mga hobbyist engine ay nagsisimula sa isang mabangis-puwersang pamamaraan (pag-check sa bawat pixel sa naturang kahon) at kalaunang pinabuti sa pamamagitan ng mga ekwasyon sa gilid.
Pagpapahamak at Pagliliwanag
Ang isang payak na flat-shaed engine ay gumagamit ng isang nag-iisang kulay sa bawat tatsulok, ang komputasyon mula sa mukhang normal at isang tanging pinagmumulan ng liwanag. Ang modelongLambertian ay nagbibigay ng difficial currentment: . Sa C, pinag-iisa ninyo ang normal bilang cross product ng dalawang trianggulong gilid (pagkatapos baguhin ang mga vertices sa espasyong pandaigdig), pagkatapos ay pinararami ang lightlight thy by sa pamamagitan ng base ng elementary elementary.
Upang makaragdag pa sa lalim, ipatupad Gouraud shading[ (vertex normals, interpolated sa mga piraso) o ]Phong shading[ (per-pixel normals).[kailangan ng huli ang interpoluving world pos at normals, pagkatapos ay pag-computting kada function formerencesmentsments lomoremements.
Pagtatayo ng Kasangkapan sa C: Praktikal na mga Hakbang
Ang mga taga - Ghana ay naglalakad sa paggawa ng maliit na software na 3D na makina mula sa gasgas, at ang tunguhin ay ang makapag - iwan ng umiikot na kubiko na may ilaw na naka - influent at difflection sa 640×480 pixel window.
Hakbang 1 – Magtayo ng Pixel Buffer
Bigyan ng kahulugan ang isang pananggalan para sa balangkas at lalim: at .Latin ang kuwadro hanggang maging itim at ang lalim ay tumbong sa 1.0 (far plane) bawat balangkas.
Hakbang 2 – Makahulugang Tanawin
Para sa isang cube, anim na mukha (12 triangle) ay nangangailangan ng 12×3 = 36 vertices. i-imbak ang mga ito sa isang hanay ng mga struct na may posisyon (3 palutang) at kulay (3 palutang para sa RGB).[kailangan ng sanggunian] Ang pre-defined ang 8 natatanging cube sulok at anim na kulay ng mukha. Gamitin ang isang index liver upang maiwasan ang mga bertices.
Hakbang 3 – Pagbabagong Pipeline
Ang bawat balangkas, sabay - sabay na ihanay ang modelong matrix mula sa isang anggulo (e.g., iikot(time)), ang tanawing matrix mula sa isang kamerang nakapirme na tumitingin sa pinagmulan, at ang projection matrix. Kung gayon ay gawin ang mga ito sa isang dibisyong MVP material: . Binabago ang bawat vertex sa pamamagitan ng pagpaparami sa [[FLLT:13]. Pagkatapos ay magsagawa ng perscepsence divide xy,z sa pamamagitan ng w) upang makakuha ng normal na coordinasyon (−1 hanggang sa pamamagitan ng [[1]:T] [L.
Hakbang 4 – Rasterize at Shade
Para sa bawat tatsulok, gamitin ang pamamaraang scanline. Habang naglalakad ng mga pixel, i-polate ang lalim at i-polate rin ang isang per-vertex na attribute tulad ng pandaigdigang-space position (para sa Phong) o ang vertex normal (para sa Gouraud). Pahiran ang Lambertian diffication. Isulat ang huling kulay sa framebuffer kung ang pagsubok sa lalim ay lumilipas.
Hakbang 5 – Pagtatanghal
Gamitin ang SDL (Simple DirectMedia Layer) o isang katulad na aklatan upang lumikha ng isang bintana at blit ang kuwadro. halimbawa, kasama ang SDL2: , , sa , pagkatapos at bawat balangkas.
Ang software path na ito ay tumatakbo sa CPU, kaya ang pagganap ay limitado sa ilang libong triangle kada frame. Minsang komportable, maaari mong palitan ang rasterization layer ng OpenGL, na nag-aalis ng mabigat na trabaho sa GPU habang pinananatili ang iyong transpormasyon at scene logic sa C.
Pagpasunod sa Iyong mga Kasangkapan
Isang pangunahing makina ang mabagal. Ilang mga momentasyon ang mahalaga para sa real-time performance:
- Back-face culling: Mga tatsulok ng Skip na ang mga normal ay nakaturong malayo sa kamera. Pag-iisahin ang napirmang area ng naka-sign na tatsulok (noong 2D) o suriin ang tuldok na produkto ng mukha na normal sa direksiyon ng pananaw.
- Frustum culling: Subukin ang naka-taling kahon ng isang bagay laban sa anim na eroplano ng tanawin frustum. kung ganap na sa labas, lalagpasan ang buong bagay.
- Fixed-point aritmetika: Palitan ang mga palutang-puntong operasyon na may integr math sa mahigpit na radyalisasyon presipitasyon. maraming mga gumagawa ng makina ay gumagamit ng 16.16 fixed-point para sa scanline interpolation.
- [[Cre-transform cache: Iwasang baguhin ang parehong vertex nang maraming beses sa pamamagitan ng pagbago sa lahat ng mga vertikes ng isang mesh nang isang beses, pagkatapos ay gumagamit ng mga indice.
- AngBlocked frame Statge ay sumulat: Isulat ang mga pixel sa memory-order (kaliwa-to-right, toper-to-bottom) upang mapataas ang cache matchs.
Ang mga teknikang ito ay maaaring magtulak sa isang software na tagapamahagi mula 3–5 fp hanggang 60 fp para sa mga eksena ng katamtamang kasalimuutan (e.g., ilang daang tatsulok).
Pinalalawak ang Kasangkapan
Kapag may matibay na pundasyon, puwede mong idagdag sa iyong isip ang mga bahagi nito:
- Texture Pathenging: Itore 2D imahe at interpolate UV coordinates sa mga tatsulok. Implement bilinear pansala para sa mga makinis na resulta.
- [[Talaksan: Idagdag ang mga specular na tampok (Blinn-Phong), o kahit aninong mapa.
- [[[Pangasiwaan: Gumamit ng oktree o BSP tree para mabilis na matukoy kung aling bagay ang nakikita.
- Ang interaksiyong pang-User: ay humahawak ng keyboard at mouse input upang umikot sa kamera o pumili ng mga bagay.
- Pipeline abstraksyon: Disenyo ng isang sistemang pang-lilim: binibigyang kahulugan ang vertex at piraso bilang mga induksiyong pang-trabaho, na nakapagdurulot ng nababaluktot na pagsasalin nang walang muling pag-aaklas.
Kayamanan at Higit Pang Pagbabasa
Para mas maintindihan mo ang mga ito, suriin ang mga klasikong teksto at mga tornial sa Internet na naging inspirasyon ng makinang ito:
- Scratchixel – In-depth na mga paliwanag ng rain na binagtas, radiisasyon, at matematika.
- [LUbang-gL[ – Modern OpenGL tornials; magsimula sa ⁇ Hello Triangle ⁇ kabanata.
- Wikipedia: 3D Projection – Ang pormal na matematika sa likod ng perspektibo at ortograpiyang marices.
Ang paggawa ng isang 3D engine sa C ay isang ritwal ng pag-aalsa para sa mga graphics programmers. Itinuturo nito sa iyo hindi lamang kung paano magsulat ng mahusay na kodigo kundi kung paano rin mag-iisip sa tatlong dimensiyon at makabuo ng mga sistemang performance-pritical.Simula sa isang solong umiikot na cube, pagkatapos ay magdagdag ng mas maraming tatsulok, straks, at sa wakas ay i-render out sa GPU. Ang paglalakbay mula sa hilaw C tungo sa isang ganap na gumaganang makina ay nagsisiwalat ng mahika sa likod ng bawat pixel sa screen.