Úvodná » ako » Ako procesor a GPU interagujú na vylepšenie počítačovej grafiky?

    Ako procesor a GPU interagujú na vylepšenie počítačovej grafiky?

    Centrálna procesorová jednotka (CPU) a jednotka na spracovanie grafiky počítača (GPU) interagujú s každým okamihom, keď používate počítač, aby ste vám poskytli jasné a citlivé vizuálne rozhranie. Čítajte ďalej, aby ste lepšie pochopili, ako spolupracujú.

    fotka od sskennel.

    Dnešná relácia otázok a odpovedí sa k nám pridelí zdvorilosťou SuperUser - podskupiny Stack Exchange, zoskupenia webových stránok typu Q & A.

    Otázka

    Čítačka superústroja Sathya položila otázku:

    Tu si môžete prezrieť snímku malého programu C ++ s názvom Triangle.exe s rotujúcim trojuholníkom založeným na API OpenGL.

    Samozrejme, veľmi základný príklad, ale myslím, že je použiteľný aj pri iných operáciách grafických kariet.

    Bol som len zvedavý a chcel som vedieť celý proces dvojitým kliknutím na Triangle.exe pod Windows XP, kým nevidím trojuholník, ktorý sa otáča na monitore. Čo sa stane, ako interaguje procesor (ktorý najprv spracováva .exe) a GPU (ktorý nakoniec vyvedie trojuholník na obrazovku)?

    Myslím, že zapojený do zobrazovania tohto rotujúceho trojuholníka je predovšetkým nasledujúci hardvér / softvér okrem iného:

    technické vybavenie

    • HDD
    • Systémová pamäť (RAM)
    • CPU
    • Video pamäť
    • GPU
    • displej LCD

    softvér

    • Operačný systém
    • API rozhrania DirectX / OpenGL
    • Ovládač Nvidia

    Môže niekto vysvetliť proces, možno s nejakým vývojovým diagramom pre ilustráciu?

    Nemalo by to byť zložité vysvetlenie, ktoré by pokrývalo každý jednotlivý krok (domnieva sa, že by šlo nad rámec rozsahu), ale vysvetlenie, ktoré môže nasledovať stredne pokročilý IT.

    Som si celkom istý, že veľa ľudí, ktorí by dokonca nazvali, že odborníci v oblasti IT nemôžu opísať tento proces správne.

    Odpoveď

    Hoci viacerí členovia komunity odpovedali na túto otázku, Oliver Salzburg prešiel mimoriadnou míľou a odpovedal nielen na podrobnú odpoveď, ale aj na výbornú sprievodnú grafiku.

    Obrázok JasonC, k dispozícii ako tapeta tu.

    On píše:

    Rozhodol som sa napísať trochu o aspekte programovania a o tom, ako jednotlivé komponenty hovoria. Možno to osvetlí určité oblasti.

    Prezentácia

    Čo potrebuje, aby ste dokonca mali ten jediný obrázok, ktorý ste uviedli vo svojej otázke, nakreslenej na obrazovke?

    Existuje mnoho spôsobov, ako nakresliť trojuholník na obrazovke. Pre jednoduchosť, predpokladajme, že neboli použité žiadne vertexové vyrovnávacie pamäte. (A vertex bufferje oblasť pamäte, kde ukladáte súradnice.) Predpokladajme, že program jednoducho povedal grafické spracovanie potrubia o každom jednotlivom vrchole (vrchol je len súradnice vo vesmíre) v rade.

    ale, predtým, než môžeme nakresliť čokoľvek, najskôr musíme spustiť nejaké lešenie. Uvidíme prečo neskôr:

    // Vymazanie obrazovky a vyrovnávacej pamäte hĺbky glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Obnovenie aktuálnej modelovej matice glMatrixMode (GL_MODELVIEW); glLoadIdentity (); // Kreslenie pomocou trojuholníkov glBegin (GL_TRIANGLES); // červená glColor3f (1.0f, 0.0f, 0.0f); // vrchol trojuholníka (predný) glVertex3f (0.0f, 1.0f, 0.0f); Zelená glColor3f (0.0f, 1.0f, 0.0f); // ľavý trojuholník (predný) glVertex3f (-1.0f, -1.0f, 1.0f); // modrá glColor3f (0.0f, 0.0f, 1.0f); // pravý trojuholník (predný) glVertex3f (1.0f, -1.0f, 1.0f); // Kresliť výkres GLEND ();

    Takže čo to urobilo?

    Keď napíšete program, ktorý chce používať grafickú kartu, zvyčajne vyberiete nejaké rozhranie pre vodiča. Niektoré dobre známe rozhrania s ovládačom sú:

    • OpenGL
    • Direct3D
    • CUDA

    Pre tento príklad budeme držať OpenGL. Teraz, tvoj rozhranie k ovládaču je to, čo vám dáva všetky nástroje, ktoré potrebujete na vytvorenie programu rozprávanie na grafickú kartu (alebo ovládač, ktorý potom rokovania na kartu).

    Toto rozhranie vám prinesie istotu náradie. Tieto nástroje majú podobu rozhrania API, ktoré môžete vo svojom programe zavolať.

    Toto rozhranie API je to, čo vidíme vo vyššie uvedenom príklade. Pozrime sa bližšie.

    Lešenie

    Skôr než budete môcť skutočne urobiť akýkoľvek skutočný výkres, budete musieť vykonať a nastaviť. Musíte definovať výrez (oblasť, ktorá sa skutočne vykreslí), váš pohľad ( fotoaparát do vášho sveta), aké anti-aliasing budete používať (aby ste vyhladili hranu svojho trojuholníka) ...

    Ale nebudeme sa na to pozerať. Len sa pozrieme na to, čo budete musieť urobiť každý snímok. Páči sa mi to:

    Vymazanie obrazovky

    Grafické potrubie nebude vyčistiť obrazovku pre vás každý snímok. Musíte to povedať. Prečo? To je dôvod, prečo:

    Ak nechcete vymazať obrazovku, jednoducho nakresliť to každý rámec. Preto voláme glClear sGL_COLOR_BUFFER_BIT nastavený. Druhý bit (GL_DEPTH_BUFFER_BIT) informuje OpenGL, že vymazá hĺbkapufer. Tento buffer sa používa na určenie, ktoré pixely sú vpredu (alebo za) ostatné pixely.

    premena


    Zdroj obrazu

    Transformácia je časť, v ktorej preberáme všetky vstupné súradnice (vrcholy nášho trojuholníka) a aplikujeme našu maticu ModelView. Toto je matica vysvetľuje ako naše Model (vrcholy) sú otočené, zmenšené a preložené (presunuté).

    Potom použijeme našu projekčnú maticu. Tým sa posúvajú všetky súradnice tak, aby boli správne oproti fotoaparátu.

    Teraz sa znova transformujeme s našou maticou Viewport. Robíme to, aby sme naši zmenili Model na veľkosť nášho monitora. Teraz máme súbor vrcholov, ktoré sú pripravené na vykreslenie!

    Vrátime sa k transformácii trochu neskôr.

    kreslenie

    Ak chcete nakresliť trojuholník, môžeme jednoducho povedať OpenGL, aby začal nový zoznam trojúhelníkov volaním glBegin s GL_TRIANGLES konštantný.
    Existujú aj iné formy, ktoré môžete nakresliť. Ako trojuholníkový pás alebo trojuholníkový ventilátor. Ide predovšetkým o optimalizáciu, pretože vyžadujú menšiu komunikáciu medzi procesorom a GPU, aby sa nakreslilo rovnaké množstvo trojuholníkov.

    Potom môžeme poskytnúť zoznam sád 3 vrcholov, ktoré by mali tvoriť každý trojuholník. Každý trojuholník používa 3 súradnice (pretože sme v 3D priestore). Okrem toho tiež poskytujem farba pre každý vrchol, volanímglColor3f pred povolania glVertex3f.

    Odtieň medzi 3 vrcholmi (3 rohy trojuholníka) je vypočítaný pomocou OpenGLautomaticky. Interpoluje farbu na celej ploche mnohouholníka.

    Interakcia

    Teraz, keď kliknete na okno. Aplikácia musí zachytiť iba správu okna, ktorá signalizuje kliknutie. Potom môžete v požadovanom programe spustiť ľubovoľnú akciu.

    Toto dostane a veľa ťažšie, keď začnete komunikovať s vašou 3D scénou.

    Najprv musíte jasne vedieť, na ktorom pixeli používateľ klepol na okno. Potom, vziať svoje perspektíva, môžete vypočítať smer lúča, odkedy kliknete myšou do scény. Potom môžete vypočítať akýkoľvek objekt vo vašej scéne pretína s týmto lúčom. Teraz už viete, či používateľ klikol na objekt.

    Takže, ako to robíte?

    premena

    Som si vedomý dvoch typov transformácií, ktoré sa všeobecne uplatňujú:

    • Transformácia založená na matici
    • Transformácia na báze kostnej hmoty

    Rozdiel je v tom ostatky ovplyvniť jeden vrcholy. Matrice vždy ovplyvňujú všetky nakreslené vrcholy rovnakým spôsobom. Pozrime sa na príklad.

    príklad

    Skôr sme naložili naše identity matrix pred našim trojuholníkom. Matrica identity je tá, ktorá jednoducho poskytuje žiadna transformácia vôbec. Takže, čokoľvek som kresliť, je ovplyvnená iba mojou perspektívou. Takže trojuholník sa vôbec nezmení.

    Ak sa chcem teraz otočiť, mohol by som buď urobiť matematický test sám (na CPU) a jednoducho zavolať glVertex3f sostatné súradnice (ktoré sa otáčajú). Alebo by som mohol nechať GPU robiť všetku prácu, volaním glRotatefpred nakreslením:

    // Otočiť trojuholník na osi Y glRotatef (množstvo, 0.0f, 1.0f, 0.0f); 

    čiastka je samozrejme len pevnou hodnotou. Ak chceš oživiť, budete musieť sledovať čiastkaa zvýšiť ho každý rámček.

    Takže, počkajte, čo sa stalo so všetkými diskusiami o matici skôr?

    V tomto jednoduchom príklade sa nemusíte starať o matrice. Jednoducho zavoláme glRotatef a stará sa o všetko pre nás.

    glRotate rotuje sa uhol stupňov okolo vektora x y z. Súčasná matica (seeglMatrixMode) sa vynásobí rotačnou maticou s produktom nahradzujúcim aktuálnu maticu, pretože ifglMultMatrix bol nazvaný s nasledujúcou maticou ako jej argument:

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

    No, ďakujem za to!

    záver

    Čo sa stane samozrejmosťou, je veľa rozprávania na OpenGL. Ale to nehovorí nami čokoľvek. Kde je komunikácia?

    Jediná vec, ktorú nám v tomto príklade hovorí OpenGL, je keď je to hotovo. Každá operácia bude trvať určitý čas. Niektoré operácie sú neuveriteľne dlhé, iné sú neuveriteľne rýchle.

    Odoslanie vrcholu na GPU bude tak rýchlo, ja by som ani nevedel, ako to vyjadriť. Odosielanie tisícov vrcholov z CPU do GPU, každý jednotlivý snímok, je s najväčšou pravdepodobnosťou žiadnym problémom.

    Vymazanie obrazovky môže trvať milisekunda alebo horšie (majte na pamäti, zvyčajne máte iba 16 milisekúnd času nakresliť každý snímok), v závislosti od veľkosti vášho výrezu. Ak chcete ho odstrániť, OpenGL musí nakresliť každý pixel vo farbe, ktorú chcete vymazať, čo môže byť milióny pixelov.

    Okrem toho môžeme prakticky len požiadať OpenGL o možnosti grafického adaptéra (max. Rozlíšenie, max. Anti-aliasing, maximálna farebná hĺbka ...).

    Ale môžeme tiež vyplniť štruktúru s pixelmi, ktoré majú špecifickú farbu. Každý pixel tak má hodnotu a textúra je obrovský "súbor" naplnený údajmi. Môžeme to nahrať do grafickej karty (vytvorením vyrovnávacej textúry), potom načítať shader, povedať, že shader používať našu štruktúru ako vstup a spustiť niektoré extrémne ťažké výpočty na našom "súbore".

    Môžeme potom "vykresliť" výsledok nášho výpočtu (vo forme nových farieb) do novej štruktúry.

    Takto môžete GPU pracovať pre vás inými spôsobmi. Predpokladám, že CUDA sa podobá tomuto aspektu, ale nikdy som nemala príležitosť pracovať s ním.

    Naozaj sme sa len trochu dotkli celého predmetu. Programovanie 3D grafiky je peklo šelmy.


    Image Source


    Máte niečo doplniť vysvetlenie? Vyjadrite sa v komentároch. Chcete sa dozvedieť viac odpovedí od iných používateľov technickej úrovne Stack Exchange? Pozrite sa na celý diskusný príspevok tu.