Nemáte nainštalovaný Adobe Flash plug-in.

Programujeme GPU / 5. časť

V tej­to čas­ti se­riá­lu opí­še­me tie prí­ka­zy kniž­ni­ce OpenGL, po­mo­cou kto­rých nas­ta­vu­je­me vstup­no-vý­stup­né pre­men­né (I/O va­riab­les) sha­de­rov.

At­ri­bú­ty vr­cho­lov (ver­tex at­tri­bu­tes)
A. V prí­pa­de po­uži­tia tzv. za­bu­do­va­ných (built-in) pre­men­ných špe­ci­fi­ku­je­me at­ri­bú­ty vr­cho­lov (po­lo­ha, far­ba...) tým naj­jed­no­duc­hším spô­so­bom, a sí­ce v rám­ci blo­ku gl­Be­gin() – glEnd(). Tak­to špe­ci­fi­ko­va­né at­ri­bú­ty sú sha­de­rom sprís­tup­ne­né po­mo­cou auto­ma­tic­ky nas­ta­ve­ných built-in pre­men­ných (gl_Ver­tex, gl­Co­lor...). Ten­to spô­sob sa však veľ­mi ne­vy­uží­va, pre­to­že je má­lo flexibil­ný a ne­pos­ky­tu­je po­ža­do­va­ný vý­kon.

B. Vý­kon­nej­ší va­riant sú tzv. po­lia vr­cho­lov (ver­tex arrays), kto­ré mô­že­me po­uží­vať dvo­ma spô­sob­mi:

1. po­mo­cou špe­ci­fic­kej (spe­ci­fic, con­ven­tio­nal) de­fi­ní­cie pr­vkov po­lí (gl­Ver­texPoin­ter(), gl­Co­lor­Poin­ter()...) – úče­lo­vo vop­red prip­ra­ve­né po­lia napĺňa­me vop­red sta­no­ve­ný­mi at­ri­bút­mi vr­cho­lov,
2. všeo­bec­nou (ge­ne­ric) de­fi­ní­ciou pr­vkov po­lí (gl­Ver­texAt­trib(), gl­Ver­texAt­trib­Poin­ter()...) – účel kon­krét­ne­ho po­ľa nie je pres­ne sta­no­ve­ný, po­lia te­da mô­že­me napĺňať ľu­bo­voľ­ný­mi at­ri­bút­mi.

Naj­čas­tej­šie po­uží­va­ný spô­sob je po­sled­ne me­no­va­ný, pri kto­rom at­ri­bú­ty vr­cho­lov špe­ci­fi­ku­je­me po­mo­cou všeo­bec­nej de­fi­ní­cie pr­vkov po­lí. Po­uží­va­me na to nas­le­du­jú­ce fun­kcie:

gl­Ver­texAt­trib() – špe­ci­fi­ku­je kon­krét­ny at­ri­bút vr­cho­lu, špe­ciál­ny prí­pad je špe­ci­fi­ká­cia at­ri­bú­tu umies­tne­né­ho na po­zí­cii 0, kto­rá je ek­vi­va­len­tná prí­ka­zu gl­Ver­tex(). Po vy­ko­na­ní toh­to prí­ka­zu OpenGL chá­pe pro­ces špe­ci­fi­ká­cie at­ri­bú­tov kon­krét­ne­ho vr­cho­lu za ukon­če­ný a da­ný vr­chol spra­cu­je.

gl­Ver­texAt­trib­Poin­ter() – špe­ci­fi­ku­je mno­ži­nu (po­le) at­ri­bú­tov vr­cho­lu, zväč­ša ide o špe­ci­fi­ká­ciu kon­krét­ne­ho at­ri­bú­tu (napr. po­lo­hy), ale po­mo­cou tzv. prek­la­da­nia (stri­de) mô­že­me po­mo­cou jed­né­ho po­ľa špe­ci­fi­ko­vať via­ce­ro at­ri­bú­tov na­raz.

glE­nab­le­Ver­texAt­tri­bArray() – po­vo­lí/za­ká­že po­uží­va­nie kon­krét­ne­ho po­ľa at­ri­bú­tov umies­tne­né­ho na kon­krét­nej po­zí­cii (slot).

glDrawArrays() – vy­kres­le­nie ob­jek­tov zlo­že­ných z vr­cho­lov, kto­rých at­ri­bú­ty sme špe­ci­fi­ko­va­li po­mo­cou prí­ka­zov na prá­cu s po­ľa­mi vr­cho­lov.

gpu obr1.jpg

Obr. 1 Umies­tne­nie všeo­bec­ných at­ri­bú­tov v po­rov­na­ní s ich špe­ci­fic­ký­mi ek­vi­va­len­tmi

At­ri­bú­ty vr­cho­lov špe­ci­fi­ko­va­né po­mo­cou po­lí sprís­tup­ní­me sha­de­rom dvo­ma spô­sob­mi:

1. Nec­há­me lin­ker vy­tvo­riť pre­po­je­nia (bi­ndings) auto­ma­tic­ky (po­dľa vop­red sta­no­ve­né­ho ma­po­va­nia).
2. Špe­ci­fi­ku­je­me pre­po­je­nie ruč­ne (expli­cit­ly).

Za­uží­va­ný je dru­hý spô­sob, pri kto­rom po­uží­va­me prí­kaz gl­Bin­dAt­trib­Lo­ca­tion(). Ním pre­po­jí­me kon­krét­ne po­le s pre­men­nou de­fi­no­va­nou v sha­de­ri. Dô­le­ži­tý je fakt, že pre­po­je­nie vzni­ká pred zos­ta­ve­ním (link) prog­ra­mu. Na ús­peš­né vy­tvo­re­nie no­vé­ho pre­po­je­nia, kto­ré má vznik­núť po pre­doš­lom zos­ta­ve­ní prog­ra­mu, mu­sí­me prog­ram zno­vu zos­ta­viť (po­mo­cou glLinkProg­ram()).
Zoz­nam prí­ka­zov po­uží­va­ných na špe­ci­fi­ká­ciu at­ri­bú­tov vr­cho­lov dopĺňa­jú prí­ka­zy: gl­Ge­tAt­trib­Lo­ca­tion(), gl­Ge­tAc­ti­veAt­trib(), gl­Get­Ver­texAt­trib() a gl­Get­Ver­texAt­trib­Poin­ter().

gpu obr2.jpg
Obr. 2 Ukáž­ka sha­de­ra, kto­rý mo­di­fi­ku­je far­by po­vr­chu ob­jek­tov po­dľa štruk­tú­ry mú­ra zlo­že­né­ho z te­hál


Pre­men­né uni­form (uni­form va­riab­les)
Pre­men­né uni­form sa ne­me­nia tak čas­to ako ­at­ri­bú­ty vr­cho­lov. Nas­ta­vu­je­me ich až po zos­ta­ve­ní (link) prog­ra­mu, po kto­rom je zná­me ich umies­tne­nie (lo­ca­tion). Pre­po­je­nia sa v tom­to prí­pa­de vy­tvá­ra­jú auto­ma­tic­ky v sú­la­de s im­ple­men­tá­ciou API OpenGL a nie sú špe­ci­fi­ko­va­né po­uží­va­te­ľom. Na nas­ta­vo­va­nie pre­men­ných ­uni­form po­uží­va­me nas­le­du­jú­ce prí­ka­zy:

gl­Ge­tU­ni­formLo­ca­tion() – zís­ka­nie umies­tne­nia pre­men­nej uni­form.

glU­ni­form() – nas­ta­ve­nie pre­men­nej uni­form ak­tuál­ne po­uží­va­né­ho prog­ra­mu, po­mo­cou toh­to prí­ka­zu nas­ta­vu­je­me aj tzv. pre­men­né sam­pler, kto­ré po­uží­va­me na prís­tup k textú­ram, v tom­to prí­pa­de ide o nas­ta­ve­nie čís­la textú­ro­va­cej jed­not­ky, kto­rá spra­cú­va prís­luš­nú textú­ru.

glU­ni­for­mMat­rix() – nas­ta­ve­nie pre­men­nej uni­form – ma­ti­ce (mat­rix).

Zoz­nam prí­ka­zov po­uží­va­ných na nas­ta­ve­nie pre­men­ných uni­form ­dopĺňa­jú prí­ka­zy gl­Ge­tU­ni­form() a gl­Ge­tAc­ti­veU­ni­form().

Zdroj: Infoware 6-7/2011



Ohodnoťte článok:
   
Hľadáte predošlé príspevky? Zobraziť pôvodnú diskusiu
comments powered by Disqus
 

24 hodín

týždeň

mesiac

Najnovšie články

Prog­ra­mu­je­me GPU / 5. časť
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. čítať »
 
Prog­ra­mu­je­me GPU / 4. časť
V tejto časti seriálu budeme pokračovať v opise integrácie kódu shaderov do aplikácií OpenGL. Zameriame sa na vstupno-výstupné rozhrania čítať »
 
Prog­ra­mu­je­me GPU / 3. časť
V tomto článku ukážeme, ako integrovať kód shaderov do kódu aplikácií OpenGL. Opíšeme tie príkazy knižnice OpenGL, ktoré budeme potrebovať na vzájomnú integráciu oboch kódov. čítať »
 
Prog­ra­mu­je­me GPU / 2. časť
V tejto časti seriálu sa budeme venovať fixnému renderovaciemu procesu (fixed rendering pipeline) grafickej knižnice OpenGL. čítať »
 
Prog­ra­mu­je­me GPU / 1. časť
Myšlienka napísať sériu článkov týkajúcich sa programovania grafických procesorov (GPU – Gra­phics Processing Unit) vznikla v období prípravy záverečných častí seriálu OpenGL v Linuxe. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter