SAMSUNG_082022 Advertisement SAMSUNG_082022 Advertisement SAMSUNG_082022 Advertisement

Python: Vulkan / 28. časť

0

Touto časťou seriálu budeme plynule pokračovať v opise grafických možností jazyka Python, tentoraz v spojitosti s API Vulkan. Hneď v úvode pripomenieme, že spájať Python s programovaním vysokovýkonnej počítačovej grafiky nie je to pravé orechové. Napriek tomu stále existuje mnoho prípadov, kde toto spojenie vyniká, a to najmä pre jeho vysokú efektívnosť. API Vulkan, ako nástupca OpenGL, síce oveľa plnohodnotnejšie využijeme v spojení s programovacím jazykom C, a čo je najdôležitejšie, vôbec ho nemusíme preferovať pred starším OpenGL, ale jeho znalosť určite rozšíri naše programátorské vedomosti a môže nás nasmerovať pri vývoji budúcich grafických aplikácií.

Vulkan

Počítačoví nadšenci, ktorí sa zaoberajú počítačovou grafikou, a takisto čitatelia našich seriálov o programovaní počítačovej grafiky určite poznajú grafické API OpenGL. Jeho prvá verzia bola vydaná v roku 1992, posledná v roku 2017. Toto multiplatformové rozhranie určené na rendering 2D a 3D grafiky opisuje (deklaruje) funkcie, ktoré sú definované v rámci konkrétnych implementácií, resp. knižníc API OpenGL, je stále výborne použiteľné pri programovaní grafických aplikácií rôzneho druhu. Jeho jadro však je, resp. bolo vyvinuté pre hardvér minulých rokov. Neuveriteľne rýchly vývoj hardvéru, a tým nemyslíme iba grafické adaptéry klasických PC, ale aj ďalších IT zariadení, nevynímajúc tablety, smartfóny, herné konzoly či iné smart, high-end alebo wearable zariadenia s kompatibilnými GPU, si vyžiadal nový štandard, ktorý by bol omnoho presnejšie zacielený na tento modernizovaný hardvér. Odpoveď na nové požiadavky prinieslo konzorcium Khronos Group v roku 2016 prostredníctvom API Vulkan, ktoré je často označované ako „next generation“ OpenGL.


Obr. 1  Porovnanie prístupu OpenGL a Vulkanu ku GPU

OpenGL vs Vulkan

Bez toho, aby sme hĺbkovo rozoberali, v čom je Vulkan lepší či horší oproti OpenGL, musíme skonštatovať, že priniesol do sveta počítačovej grafiky viacero zlepšení. V prvom rade umožnil efektívnejšie využiť výkon moderných GPU. Vulkan má silne multiplat­formové/multivláknové jadro a umožňuje oveľa širšiu a detailnejšiu programátorskú kontrolu renderovacieho procesu. V základe ponúka paralelné vysoko efektívne vykonávanie predpripravených skupín príkazov (Command Buffers) s čo najmenším vplyvom na CPU. To sa však nezaobišlo bez istých nevýhod, medzi ktoré patrí najmä nutnosť zložitejšej prípravy prostredia, kontrola synchronizácie a zložitejší pamäťový manažment. Programový kód aj tej najjednoduchšej aplikácie Vulkan je oveľa dlhší ako kód tej istej aplikácie vo formáte OpenGL. Veľmi dôležitá novinka je použitie predkompilovaných shaderov. Programový kód shaderov treba pred použitím v rámci Vulkanu previesť do tzv. SPIR-V (Intermediate Language) kódu. To má hneď niekoľko výhod. Prvou je, že kód shaderov možno „zakryť“, to značí, že vývojári získali možnosť uchovať si svoje duševné vlastníctvo. Ďalšia výhoda je možnosť vývoja shaderov vo vybranom programovacom jazyku, pričom kód je následne pretransformovaný na medziformát pomocou SPIR-V Translatora. SPIR-V okrem toho umožňuje jednoduchší vývoj ovládačov GPU, ktoré nemusia mať implementované kompilátory vysokoúrovňového kódu.

V krátkosti možno zlepšenia, ktoré priniesol Vulkan, zhrnúť v nasledujúcich bodoch:

• Lepšie zladený a zacielený na moderný multiplatformový hardvér

• Priama predpovedateľná kontrola GPU

• Takmer celá konfigurácia grafického pipeline je pripravená vopred

• Natívna podpora multi-core a multi-thread kódu

• Odstránenie zastaranej funkcionality

• Použitie SPIR-V shaderov

Obr. 2 Ekosystém SPIR-V

Štruktúra aplikácií

API Vulkan je omnoho modulárnejšie, vy­užívajúce veľa rôznych vrstiev (Layered Ecosystem). Poskytuje rozšírenú architektúru na kontrolu a profilovanie kódu bez ovplyvnenia celkového výkonu. Na to si vyžaduje podstatne zložitejšiu prípravu kódu. Nie je v možnostiach tohto článku opísať všetky detaily a nahradiť niekoľkostranovú referenciu API Vulkan. No na to, aby sme mali aspoň základnú predstavu o programovej štruktúre aplikácií Vulkan, musíme uviesť tie najzákladnejšie úlohy, ktoré je nevyhnutné vykonať na zobrazenie grafiky (tab. 1).

Serializované operácie odovzdávané konkrétnemu GPU sú zaraďované do externe synchronizovaných radov (VkQueue) v rámci konkrétnych Queue Families. Zložitejšie aplikácie si navyše vyžadujú prácu so zásobníkmi údajov patriacich vrcholom objektov scény, zásobníkmi uniformných premenných, prácu s textúrami, CPU-GPU a GPU-GPU synchronizáciu (VkEvent, VkSemaphore, VkFence, Pipeline Barriers), reportovanie či validáciu kódu.

Rendering scén prebieha v nasledujúcom algoritme:

1 vkBeginCommandBuffer()

     1a vkCmdBeginRenderPass()

1a1 vkCmdBindPipeline()

1a2 vkCmdBindDescriptorSets()

1a3 vkCmdSetViewport()

1a4 vkCmdDraw()

     1b vkCmdEndRenderPass()

2 vkEndCommandBuffer()

3 vkQueueSubmit()

4 vkQueuePresentKHR()

 

 

Zobrazit Galériu

Marek Sopko

Všetky autorove články

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať