
Python: PyOpenGL / 27. časť
V roku 2011, konkrétne v aprílovom vydaní magazínu Infoware, sme uverejnili tretiu časť seriálu Programujeme GPU, kde sme predstavili zdrojový kód aplikácie glsl v1.0. O tri roky neskôr, v januári 2014, sme publikovali prvú časť seriálu Programujeme pre Android, v rámci ktorej sme transformovali kód uvedenej aplikácie tak, aby bol spustiteľný na platforme Android. Po ôsmich rokoch sme sa rozhodli ten istý kód oprášiť a napísať ho v jazyku Python. Bez preháňania musíme konštatovať, že sme túto úlohu splnili bravúrne. V prvom rade k tomu prispela jednoduchosť, produktívnosť a efektivita jazyka Python, k čomu sa následne pridala nadčasovosť našich aplikácií. Tým chceme fakticky upozorniť na to, že v roku 2011 sme pripravili a prezentovali kód, ktorý je s minimálnymi úpravami použiteľný aj v roku 2022. Svojou štruktúrou a obsahom dodržuje štandardy, ktoré sú stále platné a ktoré sú základom pre ďalší vývoj v danej oblasti.
Príprava prostredia
Na to, aby sme mohli naprogramovať a spustiť vzorovú aplikáciu PyGLSLv1, musíme mať v našom virtuálnom prostredí (Python venv) nainštalované tieto balíčky: glfw, PyGLM, PyOpenGL, Pillow, numpy. Ich inštaláciu vykonáme veľmi jednoducho, a to kliknutím na záložku Python Packages v spodnej časti IDE PyCharm, vpísaním názvu balíčka na riadok Search for more packages a po úspešnom nájdení balíčka kliknutím na tlačidlo Install v pravej časti okna. Je samozrejmé, že spomínané balíčky môžeme doinštalovať aj mimo prostredia PyCharm, a to vykonaním príkazov: sudo apt install pip a pip install glfw pyglm pyopengl numpy. Po kontrole, resp. doplnení uvedených balíčkov môžeme začať programovať.
Štruktúra zložiek a súborov aplikácie
Pri transformácii pôvodného kódu C++ na kód jazyka Python sme sa snažili v maximálnej miere skopírovať štruktúru a obsah pôvodnej aplikácie. Na zjednodušenie a urýchlenie celého procesu sme však nepretransformovali kompletný kód, ale iba jeho najdôležitejšie časti tak, aby sme mohli prezentovať funkčný výsledok. Štruktúra zložiek a súborov vzorovej aplikácie PyGLSLv1 sa nám tak „scvrkla“ na nasledujúci stav:
data |
|
default.png |
obrázok textúry |
shaders |
|
base.fs |
kód fragment shadera |
base.vs |
kód vertex shadera |
venv |
virtuálne prostredie Pythonu – nie je súčasťou distribuovaného balíka |
avatar.py |
modul na prácu s avatarom, resp. kamerou |
glsl.py |
hlavný programový súbor aplikácie |
objects.py |
modul určený na definíciu objektov |
shader.py |
modul na prácu so shadermi |
Moduly avatar, objects a shader obsahujú pomocný kód, na ktorý sa odvoláva modul glsl. V prípade modulu avatar sme sa snažili maximálne napodobniť pôvodný kód vrátane použitia rovnakých názvov premenných, funkcií a takisto rovnakej filozofie pohybu a rotácie kamery. V prípade Pythonu si môžeme všimnúť, že kód, aj keď neobsahuje všetku funkcionalitu pôvodného kódu, je oveľa jednoduchší a navyše možno konštatovať, že je aj prehľadnejší. Čo sa týka matematických operácií súvisiacich s grafickou knižnicou OpenGL, využívame tu funkcionalitu matematickej knižnice glm určenej pre Python s názvom PyGLM (https://pypi.org/project/PyGLM). Pohyb kamery je možný v štyroch smeroch (F, B, L, R), natočenie je možné okolo osi X (Pitch) a Y (Yaw). Modul objects obsahuje definície základných objektov našej trojrozmernej scény, a síce kocky, gule, valca, ihlana a dvoch plôch. Vo všetkých prípadoch definujeme polohu vrcholov, RGB údaje farieb a textúrovacie súradnice v každom vrchole. V tomto prípade vykonávame potrebné matematické operácie s využitím funkcionality balíčka NumPy (https://numpy.org). Posledný z pomocných modulov s názvom shader obsahuje funkcie určené na prácu so shadermi. Ich úlohou je načítať kód vertex a fragment shaderov, vytvoriť a skompilovať príslušné objekty a následne vytvoriť a zlinkovať shader program.
Obr. 1 Hlavné komponenty algoritmu aplikácie PyGLSLv1
glsl.py
Hlavný programový súbor aplikácie glsl.py v úvode importuje funkcie multiplatformovej knižnice GLFW (https://www.glfw.org) a spomínané pomocné moduly. Následne definuje hodnoty použitých premenných, vytvára objekt triedy Avatar, definuje obsah hlavnej funkcie main() a ďalších funkcií.
Algoritmus použitý na vytvorenie funkčnej aplikácie sa v mnohom podobá algoritmu, ktorý sme použili v pôvodnej aplikácii. Jeho základné kroky sú nasledujúce:
-
1. Inicializácia a vytvorenie okna GLWF2. Definícia funkcií Callback (zmena veľkosti okna, reakcia na pohyb myši vrátane pohybu kolieska myši)3. Nastavenie stavového stroja OpenGL4. Príprava textúry (s využitím funkcionalít knižnice Pillow – https://pillow.readthedocs.io)5. Príprava objektov6. Príprava shader programu7. Spustenie hlavného programového cyklua) Správa časub) Reakcia na stlačenie klávesovc) Zmazanie zásobníkov OpenGLd) Vykreslenie objektov8. Uvoľnenie alokovaných zdrojov9. Ukončenie aplikácie
Obr. 2 Grafický výstup aplikácie PyGLSLv1
PyOpenGL (http://pyopengl.sourceforge.net)
Knižnica PyOpenGL je implementáciou špecifikácie API OpenGL v rámci Pythonu. Funkcie knižnice PyOpenGL verzie 1.x boli naprogramované pomocou Python C API. Pri verzii 2.x bol použitý nástroj SWIG, čo je v kontraste s poslednými verziami 3.x, ktoré využívajú tzv. OpenGL-ctypes (https://docs.python.org/3/library/ctypes). Knižnica PyOpenGL v každom prípade umožňuje využívať funkcionalitu API OpenGL pri programovaní v jazyku Python. Samozrejme, nemôžeme tu hovoriť o efektivite a rýchlosti takto naprogramovaných OpenGL aplikácií. To však nevylučuje fakt, že stále existuje množstvo rôznych situácií, pri ktorých dokážeme funkcionalitu ponúkanú Pythonom v spojení s OpenGL plnohodnotne využiť.
Ako istotne viete, OpenGL sám sebe nešpecifikuje spôsob prípravy okna, resp. časti obrazovky, ktorú používa pri výkone svojej funkcionality. Takisto sa nezaoberá možnosťami správy vstupno-výstupných zariadení, resp. inými ako grafickými funkciami. Tieto úlohy musíme realizovať iným spôsobom, a to buď využitím funkcionality integrovanej v našom systéme, čím však obmedzíme spustiteľnosť našich aplikácií na konkrétnu platformu, alebo využitím funkcionality multimediálnych knižníc, ako sú napr. SDL či GLFW. V prípade aplikácie PyGLSLv1 sme použili knižnicu GLFW, aj keď obe spomínané knižnice sú v mnohom porovnateľné a výber jednej z nich je viac-menej záležitosť osobných, skúsenostných preferencií daného programátora.
Zobrazit Galériu