PANASONIC PANASONIC PANASONIC

Python: PyOpenGL / 27. časť

0

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, objectsshader 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. 1. Inicializácia a vytvorenie okna GLWF
    2. Definícia funkcií Callback (zmena veľkosti okna, reakcia na pohyb myši vrátane pohybu kolieska myši)
    3. Nastavenie stavového stroja OpenGL
    4. Príprava textúry (s využitím funkcionalít knižnice Pillow – https://pillow.readthedocs.io)
    5. Príprava objektov 
    6. Príprava shader programu
    7. Spustenie hlavného programového cyklu
    a) Správa času
    b) Reakcia na stlačenie klávesov
    c) Zmazanie zásobníkov OpenGL
    d) Vykreslenie objektov
    8. Uvoľnenie alokovaných zdrojov
    9. 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

Marek Sopko

Všetky autorove články

Pridať komentár

Mohlo by vás zaujímať

Mohlo by vás zaujímať