Domača » kako » Kako CPU in GPU vplivata na računalniško grafiko?

    Kako CPU in GPU vplivata na računalniško grafiko?

    Osrednja procesna enota računalnika (CPU) in grafična procesna enota (GPU) sodelujeta vsak trenutek, ko uporabljate računalnik, da vam omogočita jasen in odziven vizualni vmesnik. Preberite, da boste bolje razumeli, kako delujejo skupaj.

    Foto: sskennel.

    Današnja seja vprašanj in odgovorov prihaja z namenom SuperUser-a, ki je del skupine Stack Exchange, ki združuje skupino spletnih mest za vprašanja in odgovore.

    Vprašanje

    Bralnik SuperUser Sathya je zastavil vprašanje:

    Tukaj si lahko ogledate sliko majhnega programa C ++, imenovanega Triangle.exe, z rotirajočim trikotnikom, ki temelji na API-ju OpenGL..

    Res je, da je zelo osnovni primer, vendar mislim, da se uporablja za druge operacije grafičnih kartic.

    Bil sem radoveden in želel sem vedeti celoten proces od dvojnega klikanja na Triangle.exe pod Windows XP, dokler ne vidim trikotnika, ki se vrti na monitorju. Kaj se zgodi, kako CPU (ki najprej obdeluje .exe) in GPU (ki na koncu izide trikotnik na zaslonu) medsebojno delujejo?

    Predvidevam, da pri prikazovanju tega rotirajočega trikotnika uporabljamo predvsem naslednjo strojno / programsko opremo:

    Strojna oprema

    • HDD
    • Sistemski pomnilnik (RAM)
    • CPU
    • Video pomnilnik
    • GPU
    • LCD zaslon

    Programska oprema

    • Operacijski sistem
    • API DirectX / OpenGL
    • Nvidia gonilnik

    Ali lahko kdorkoli pojasni proces, morda z nekakšnim diagramom poteka za ilustracijo?

    Ne bi smelo biti zapleteno pojasnilo, ki bi zajemalo vsak posamezen korak (ugibajte, da bi to preseglo obseg), vendar lahko pojasnite, kako lahko vmesni IT-uporabnik.

    Prepričan sem, da veliko ljudi, ki bi se celo imenovali za IT strokovnjake, tega procesa ne bi mogli pravilno opisati.

    Odgovor

    Čeprav je več članov skupnosti odgovorilo na vprašanje, je Oliver Salzburg odšel še dodatno in odgovoril ne le z natančnim odzivom, ampak z odlično spremljajočo grafiko..

    Slika JasonC, ki je na voljo kot ozadje.

    On piše:

    Odločil sem se, da napišem nekaj o programskem vidiku in kako se sestavni deli med seboj pogovarjajo. Mogoče bo razjasnilo nekatera področja.

    Predstavitev

    Kaj je potrebno, da je celo ena slika, ki ste jo objavili v svojem vprašanju, narisana na zaslonu?

    Obstaja več načinov, da na zaslonu narišete trikotnik. Zaradi poenostavitve predpostavimo, da niso bili uporabljeni vmesni pufri. (A vmesni vmesnikje območje pomnilnika, kjer shranjujete koordinate.) Predpostavimo, da je program preprosto povedal, da je cevovod za obdelavo grafike o vsaki posamezni tocki (tocka je le koordinata v prostoru) v vrsti.

    Toda, preden lahko pripravimo karkoli, moramo najprej zagnati nekaj odra. Bomo videli zakaj pozneje:

    // Počistite zaslon in globinski vmesnik glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Ponastavitev trenutne matrice pogleda modela glMatrixMode (GL_MODELVIEW); glLoadIdentity (); // Risanje z uporabo trikotnikov glBegin (GL_TRIANGLES); // Red glColor3f (1.0f, 0.0f, 0.0f); // Najvišji trikotnik (spredaj) glVertex3f (0.0f, 1.0f, 0.0f); // Zelena glColor3f (0.0f, 1.0f, 0.0f); // Levo od trikotnika (spredaj) glVertex3f (-1.0f, -1.0f, 1.0f); // Blue glColor3f (0.0f, 0.0f, 1.0f); // Desno od trikotnika (spredaj) glVertex3f (1.0f, -1.0f, 1.0f); // Opravljeno risanje glEnd ();

    Kaj je to storilo??

    Ko napišete program, ki želi uporabljati grafično kartico, boste običajno izbrali nekakšen vmesnik za gonilnik. Nekateri dobro znani vmesniki za gonilnik so:

    • OpenGL
    • Direct3D
    • CUDA

    V tem primeru bomo uporabili OpenGL. Zdaj, vaš vmesnik za voznika je tisto, kar vam daje vsa orodja, ki jih potrebujete za program pogovor na grafično kartico (ali gonilniku, ki je potem pogovori na kartico).

    Ta vmesnik vam bo zagotovo zagotovil orodja. Ta orodja so v obliki API-ja, ki ga lahko pokličete iz svojega programa.

    Ta API je tisti, ki ga uporabljamo v zgornjem primeru. Poglejmo natančneje.

    Odri

    Preden lahko resnično naredite kakršnokoli risbo, boste morali opraviti a nastaviti. Določiti morate svoj pogled (območje, ki bo dejansko upodobljeno), vaš pogled ( kamero v svoj svet), kakšno anti-aliasing boste uporabljali (za glajenje robov svojega trikotnika)…

    Toda tega ne bomo gledali. Pokukali bomo stvari, ki jih boste morali storiti vsak okvir. Kot:

    Brisanje zaslona

    Grafični cevovod ne bo očistil zaslona za vsak okvir. Moral boš povedati. Zakaj? To je razlog, zakaj:

    Če ne počistite zaslona, ​​boste preprosto draw over vsak okvir. Zato pozivamo glClear zGL_COLOR_BUFFER_BIT nastavite. Drugi bit (GL_DEPTH_BUFFER_BIT) pove OpenGL, da počisti globinopufra. Ta medpomnilnik se uporablja za določanje, kateri piksli so pred (ali za) drugimi slikovnimi pikami.

    Transformacija


    Vir slike

    Transformacija je del, kjer vzamemo vse vhodne koordinate (tocke našega trikotnika) in uporabimo našo ModelView matrico. To je matrika, ki pojasnjuje kako naše model (točke) so obrnjene, spremenjene in prevedene (premaknjene).

    Nato uporabimo našo projekcijsko matrico. To premakne vse koordinate, tako da se pravilno soočijo z našo kamero.

    Zdaj se znova spremenimo z našo matrico Viewport. To naredimo, da bi povečali naše model velikosti našega monitorja. Zdaj imamo nabor točk, ki so pripravljene za upodabljanje!

    Malo kasneje se bomo vrnili k preoblikovanju.

    Risba

    Če želite narisati trikotnik, lahko preprosto naročite OpenGL, da zažene novo seznam trikotnikov s klicem glBegin z GL_TRIANGLES konstantna.
    Obstajajo tudi druge oblike, ki jih lahko narišete. Kot trikotni trak ali trikotni ventilator. To so predvsem optimizacije, saj zahtevajo manj komunikacije med CPU in GPU za risanje enake količine trikotnikov.

    Po tem lahko zagotovimo seznam nizov treh tock, ki naj bi tvorile vsak trikotnik. Vsak trikotnik uporablja 3 koordinate (kot smo v 3D-prostoru). Poleg tega nudim tudi barve za vsako točko, s klicemglColor3f prej kliče glVertex3f.

    Odtenek med 3 vozlišči (3 vogali trikotnika) izračuna OpenGLsamodejno. Barva bo interpolirala po celotnem obrazu mnogokotnika.

    Interakcija

    Zdaj, ko kliknete okno. Aplikacija mora samo zajeti sporočilo okna, ki signalizira klik. Nato lahko v svojem programu zaženete katerokoli dejanje.

    To postane lot težje, ko želite začeti vzajemno delovanje s svojo 3D sceno.

    Najprej morate jasno vedeti, na kateri piksel je uporabnik kliknil okno. Potem, vzemite svoje perspektiveupoštevajte, da lahko izračunate smer žarka, od točke, ko kliknete miško v vašo sceno. Nato lahko izračunate, ali je v prizoru kateri koli predmet seka s tem žarkom. Zdaj veste, ali je uporabnik kliknil predmet.

    Torej, kako se lahko vrti?

    Transformacija

    Zavedam se dveh vrst transformacij, ki se običajno uporabljata:

    • Preoblikovanje na podlagi matrik
    • Transformacija na osnovi kosti

    Razlika je v tem kosti vplivajo na posamezno vozlišč. Matrike vedno vplivajo na vse narisane tocke na enak nacin. Poglejmo primer.

    Primer

    Prej smo naložili naše identifikacijska matrika pred risanjem našega trikotnika. Identifikacijska matrika je tista, ki preprosto zagotavlja brez preoblikovanja nasploh. Torej, karkoli črpam, vpliva samo moja perspektiva. Torej trikotnik sploh ne bo rotiran.

    Če ga želim zdaj zavrteti, lahko naredim tudi matematiko (na CPU) in preprosto pokličem glVertex3f zdrugo koordinate (ki se obračajo). Lahko pa pustite GPU, da opravi vse delo, tako da pokliče glRotatefpred risanjem:

    // Zasuk trikotnika na osi Y glRotatef (količina, 0.0f, 1.0f, 0.0f); 

    znesek je seveda samo fiksna vrednost. Če želiš animirati, boste morali slediti znesekin poveča vsak okvir.

    Torej, počakajte, kaj se je zgodilo z vsemi matričnimi pogovori prej?

    V tem preprostem primeru nam ni treba skrbeti za matrice. Preprosto kličemo glRotatef in za vse to poskrbi za nas.

    glRotate povzroči vrtenje kota stopinj okoli vektorja x y z. Trenutna matrika (seeglMatrixMode) se pomnoži z rotacijsko matrico, pri čemer izdelek nadomesti sedanjo matrico, kot je bil ifglMultMatrix pozvan z naslednjo matriko kot svoj argument:

    x 2 - 1 - c + cx ⁡ y - 1 - c - z ⁢ sx ⁡ z ⁡ 1 - c + y 0 s 0 y ⁡ x - 1 - c + z ⁢ sy 2 - 1 - c + cy ⁢ z 1 - c - x 0 s 0 x ⁡ z ⁡ 1 - c - y ⁢ sy ⁢ z ⁡ 1 - c + x z sz 2 - 1 - c + c 0 0 0 0 1

    No, hvala za to!

    Zaključek

    Kar postane očitno, je veliko govora do OpenGL. Ampak to ne pove nas karkoli. Kje je komunikacija?

    Edina stvar, ki nam jo OpenGL pove v tem primeru je ko je končano. Vsaka operacija bo trajala nekaj časa. Nekatere operacije trajajo neverjetno dolgo, druge pa so izjemno hitre.

    Pošiljanje vozlišča na GPU bo tako hitro, da ne bi niti vedel, kako to izraziti. Pošiljanje tisočih tock iz CPU v GPU, vsak posamezen okvir, je najverjetneje sploh ne.

    Brisanje zaslona lahko traja milisekunde ali slabše (ne pozabite, da imate običajno samo 16 milisekund časa, da narišete vsak okvir), odvisno od tega, kako velik je vaš pogled. Če ga želite počistiti, mora OpenGL narisati vsako posamezno slikovno točko v barvi, ki jo želite razbrati, kar je lahko milijone slikovnih pik.

    Razen tega lahko le OpenGL-u vprašamo o zmožnostih našega grafičnega adapterja (največja ločljivost, največje preprečevanje prekrivanja, največja barvna globina,…).

    Lahko pa tudi zapolnimo teksturo s piksli, ki imajo vsako določeno barvo. Vsaka slikovna pika ima tako vrednost in tekstura je ogromna "datoteka", napolnjena s podatki. To lahko naložimo v grafično kartico (z ustvarjanjem blažilnika teksture), nato naložimo shader, povemo temu shaderju, da uporabi našo teksturo kot vhod in zaženemo nekaj izjemno težkih izračunov na naši »datoteki«.

    Rezultate našega računanja (v obliki novih barv) lahko nato »upodobimo« v novo teksturo.

    Tako lahko GPU za vas deluje na druge načine. Predvidevam, da CUDA nastopa podobno kot ta vidik, vendar nikoli nisem imel priložnosti delati z njim.

    Res smo se le malo dotaknili celotne teme. Programiranje 3D grafike je hudiča zver.


    Vir slike


    Imate kaj dodati pojasnilu? Zvok izključen v komentarjih. Želite prebrati več odgovorov drugih uporabnikov tehnologije Stack Exchange? Oglejte si celotno nit razprave tukaj.