Publikované pred rokom: 30.05.2011 / Marek Sopko, čítaní: 532
V tejto časti seriálu opíšeme tie príkazy knižnice OpenGL, pomocou ktorých nastavujeme vstupno-výstupné premenné (I/O variables) shaderov.
Atribúty vrcholov (vertex attributes)
A. V prípade použitia tzv. zabudovaných (built-in) premenných špecifikujeme atribúty vrcholov (poloha, farba...) tým najjednoduchším spôsobom, a síce v rámci bloku glBegin() – glEnd(). Takto špecifikované atribúty sú shaderom sprístupnené pomocou automaticky nastavených built-in premenných (gl_Vertex, glColor...). Tento spôsob sa však veľmi nevyužíva, pretože je málo flexibilný a neposkytuje požadovaný výkon.
B. Výkonnejší variant sú tzv. polia vrcholov (vertex arrays), ktoré môžeme používať dvoma spôsobmi:
1. pomocou špecifickej (specific, conventional) definície prvkov polí (glVertexPointer(), glColorPointer()...) – účelovo vopred pripravené polia napĺňame vopred stanovenými atribútmi vrcholov,
2. všeobecnou (generic) definíciou prvkov polí (glVertexAttrib(), glVertexAttribPointer()...) – účel konkrétneho poľa nie je presne stanovený, polia teda môžeme napĺňať ľubovoľnými atribútmi.
Najčastejšie používaný spôsob je posledne menovaný, pri ktorom atribúty vrcholov špecifikujeme pomocou všeobecnej definície prvkov polí. Používame na to nasledujúce funkcie:
glVertexAttrib() – špecifikuje konkrétny atribút vrcholu, špeciálny prípad je špecifikácia atribútu umiestneného na pozícii 0, ktorá je ekvivalentná príkazu glVertex(). Po vykonaní tohto príkazu OpenGL chápe proces špecifikácie atribútov konkrétneho vrcholu za ukončený a daný vrchol spracuje.
glVertexAttribPointer() – špecifikuje množinu (pole) atribútov vrcholu, zväčša ide o špecifikáciu konkrétneho atribútu (napr. polohy), ale pomocou tzv. prekladania (stride) môžeme pomocou jedného poľa špecifikovať viacero atribútov naraz.
glEnableVertexAttribArray() – povolí/zakáže používanie konkrétneho poľa atribútov umiestneného na konkrétnej pozícii (slot).
glDrawArrays() – vykreslenie objektov zložených z vrcholov, ktorých atribúty sme špecifikovali pomocou príkazov na prácu s poľami vrcholov.
Obr. 1 Umiestnenie všeobecných atribútov v porovnaní s ich špecifickými ekvivalentmi
Atribúty vrcholov špecifikované pomocou polí sprístupníme shaderom dvoma spôsobmi:
1. Necháme linker vytvoriť prepojenia (bindings) automaticky (podľa vopred stanoveného mapovania).
2. Špecifikujeme prepojenie ručne (explicitly).
Zaužívaný je druhý spôsob, pri ktorom používame príkaz glBindAttribLocation(). Ním prepojíme konkrétne pole s premennou definovanou v shaderi. Dôležitý je fakt, že prepojenie vzniká pred zostavením (link) programu. Na úspešné vytvorenie nového prepojenia, ktoré má vzniknúť po predošlom zostavení programu, musíme program znovu zostaviť (pomocou glLinkProgram()).
Zoznam príkazov používaných na špecifikáciu atribútov vrcholov dopĺňajú príkazy: glGetAttribLocation(), glGetActiveAttrib(), glGetVertexAttrib() a glGetVertexAttribPointer().
Premenné uniform (uniform variables)
Premenné uniform sa nemenia tak často ako atribúty vrcholov. Nastavujeme ich až po zostavení (link) programu, po ktorom je známe ich umiestnenie (location). Prepojenia sa v tomto prípade vytvárajú automaticky v súlade s implementáciou API OpenGL a nie sú špecifikované používateľom. Na nastavovanie premenných uniform používame nasledujúce príkazy:
glGetUniformLocation() – získanie umiestnenia premennej uniform.
glUniform() – nastavenie premennej uniform aktuálne používaného programu, pomocou tohto príkazu nastavujeme aj tzv. premenné sampler, ktoré používame na prístup k textúram, v tomto prípade ide o nastavenie čísla textúrovacej jednotky, ktorá spracúva príslušnú textúru.
glUniformMatrix() – nastavenie premennej uniform – matice (matrix).
Zoznam príkazov používaných na nastavenie premenných uniform dopĺňajú príkazy glGetUniform() a glGetActiveUniform().
Zdroj: Infoware 6-7/2011