× Aktuálně z oboru

Programátoři po celém světě dnes slaví Den programátorů [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]
Celá zprávička [ clanek/2018091300-programatori-po-celem-svete-dnes-slavi-den-programatoru/ ]

OpenGL Průvodce programátora

[ http://programujte.com/profil/4089-zdenek-vecera/ ]Google [ https://plus.google.com/+ZdenekVecera?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       18. 2. 2008       39 074×

Naučte se grafickou knihovnu OpenGL, z knihy, jejíž originál je ve světě nejznámějším a nejúspěšnějším titulem.

Existuje mnoho knih týkajících se programování a je celkem jedno, jestli jsou původem od známých zahraničních, nebo „jen“ českých autorů. Na českém trhu není problém nalézt kvalitní knihu popisující C++ nebo PHP. Pokud se ovšem chcete začít zajímat o programování grafiky, nastane problém (samozřejmě v případě, že nevládnete anglickým jazykem).

Přestože na Internetu existují desítky až stovky materiálů popisující knihovny DirectX či OpenGL, kniha bývá, jako vždy, většinou tím nejlepším řešením. Bohužel, dlouho neexistovala česky psaná kniha ani o DirectX [ http://www.microsoft.com/windows/directx/default.mspx ], ani o konkurenčním OpenGL [ http://www.opengl.org/ ].

Nakladatelství Computer Press [ https://knihy.cpress.cz/ ] přišlo jako první s překladem knihy Programujeme grafiku v Microsoft Direct3D [ https://knihy.cpress.cz/Pocitac/Book.asp?ID=954 ] v březnu roku 2004. Od té doby uplynulo spoustu času a možná právě proto nyní zaplňuje mezeru s druhým tématem, jímž je kniha OpenGL Průvodce programátora [ http://knihy.cpress.cz/Book.asp?BookCode=k1198 ], která je překladem světově úspěšného a oblíbeného originálu již pátého vydání knihy zvané jako The Redbook [ http://www.opengl.org/documentation/red_book/ ]. Vskutku, už dle obálky knihy je patrné (obrázek, pravý horní), že se jedná o nevšední knihu a právě celý dojem umocňuje ona zmíněná červená barva.

Česká podoba knihy se s obálkou drží zbytečně při zemi (obrázek, pravý dolní), nejspíše kvůli zaběhlému designu knih CP. Naproti tomu slabší obálku plně vynahrazuje pohled do otevřené knihy, kde se vám naskytne opravdu přehledně zpracovaný text s čitelným a dobře formátovaným zdrojovým kódem, najdete v ní nespočet velmi pěkných grafických označení různých dodatků, upozornění či jenom rad a odkazů pro další studium pokročilých uživatelů zvoleného tématu. Součástí je i spousta odkazů na další cvičení, kde můžete zapojit plně svoji fantazii při zkoumání OpenGL. Samozřejmostí jsou přehledně zpracované matematické vzorce a tabulky, které jsou často využívány při popisů funkcí (podprogramů) grafické knihovny.

Kniha popisující grafické knihovny by se jen těžce obešla bez možnosti názorné ukázky a právě proto je text neustále obklopován velmi kvalitně zpracovanými obrázky, kterých je v celé knize více než 120. Navíc obsahuje na čtyři desítky celobarevných obrázků, jež jsou názornou ukázkou síly knihovny OpenGL.

Cíle knihy

Cílem knihy je vysvětlení OpenGL ve verzi 1.5 a 2.0 výhradně ve spojení se shadery. Pokud očekáváte, že se z knihy dozvíte, jak vytvořit počítačové hry založené na OpenGL, tak se mýlíte. OpenGL, jako takové, je grafická knihovna, kterou popisuje tato kniha. Zpracování zvuků a dalších aspektů počítačových her by bylo nad rámec této knihy.

Pro koho je kniha určena?

Skutečně se jedná, jak je z názvu patrné, o průvodce programování knihovny OpenGL. Kniha je výborným materiálem pro úplného začátečníka a troufám si tvrdit, že i pokročilý uživatel by si našel, zvláště v pozdějších kapitolách, zajímavá témata. Velkým přínosem knihy je, že se autoři nesnažili o takový rozsah, který by pokryl zájmy skutečných odborníků v OpenGL. Díky tomu můžeme knihu považovat za učebnici, protože se věnuje především začínajícím a pokročilým uživatelům. A je nutno zdůraznit, že tento úkol plní znamenitě. Není tedy vůbec nutné, abyste měli nějaké zkušenosti obecně s počítačovou grafikou nebo přímo s OpenGL, avšak, máte-li takové znalosti, zajisté to bude přínosné.

Co je třeba před čtením knihy znát?

Pakliže jsem v minulém odstavci napsal, že je kniha určena pro začátečníky, tak tím byli samozřejmě myšleni začátečníci v OpenGL, nikoli v jazyce C, ve kterém jsou všechny ukázkové zdrojové kódy a tedy – ze kterého kniha vychází. Z toho je patrné, že je nutnou podmínkou pro čtení knihy znát jazyk C alespoň na úrovni pokročilejšího začátečníka, kde máte plně jasno, co jsou funkce, návratové hodnoty, volání funkcí, cykly, podmínky, větvení (switch) a další základní konstrukce. V knize není využíváno objektového kódu (C++), takže si plně vystačíte s klasickým jazykem C.

Dále je vhodné mít určité znalosti z matematiky. Geometrie, trigonometrie, lineární algebra, diferenciální počet a geometrie zajisté při čtení knihy nebude na škodu znát.

Stručný obsah knihy

Kniha je složena z 15 podrobných kapitol, 9 příloh, vysvětlivek popisujících nejčastější výrazy z programování grafiky a na konci najdete rejstřík. Pojďme si nyní alespoň stručně jednotlivé části projít a říct si, co nám nabízejí.

Kapitola 1

Je vám předložen kvalitní přehled OpenGL s popisem některých jeho možností. Právě v této části jste odkazování na již zmíněné celobarevné obrázky, které můžete konfrontovat s velmi přínosným textem týkajícím se drátěného modelu, osvětlení a jemně stínované verze, rozmazání, stínů a textů, mapování textur aj. Po lehkém začátku je vám předložen úvodní kód, který toho sice moc nedělá (vykreslí pravoúhelník na černém pozadí), ale autoři vám právě na něm vysvětlí ty nejzákladnější konstrukce knihovny OpenGL spolu s pojmy bitových polí, renderování či modelů. Následuje přehled syntaxe příkazů OpenGL, který vás zasvětí do pojmenování jednotlivých funkcí knihovny. Pokračuje vysvětlování OpenGL jako na modelu stavového automatu a začíná již podrobnější výklad, pro začátečníka zajisté těžkého tématu, OpenGL pipeline.

Zde narážíme na velmi přínosný prvek překladu, kde sice jeho autoři překládají i „známá“ anglická označení, ale originální anglická jsou stále uváděna v závorkách. Tak je tomu po celou knihu; je to velmi přínosné, pokud máte nějaké znalosti z počítačové grafiky originálních anglických termínů, anebo jenom nejste zastáncem úplného počešťování. Vysvětlení pipeline obsahuje pohled na parametrické objekty, rasterizaci, operaci s geometrickými vrcholy, body, práci s texturami, fragmenty aj. Jste seznámeni s knihovnami GLU, GLUT apod.

Následuje podrobný popis jednoduchého programu v OpenGL využívající GLUT knihovny spolu s vysvětlením základních vlastností ošetřování vstupních událostí nebo třeba kreslení trojrozměrných objektů. Dalším větším tématem jsou animace, díky kterým je vysvětlen princip prohazování bufferů a s tím související pojem fps.

Kapitola 2

Nyní již začínáme daleko vážněji než v předešlé kapitole. Jsou nám vysvětleny základy kreslení. Nejprve je zmíněno mazání oken a s tím jsou popsány druhy bufferů (Frame-buffer, Depth-buffer, aj.). Autoři nám vysvětlí, jak nastavit barvu a přinutit OpenGL k renderování scény. Dozvíme se základy kreslení okna a informace o souřadném systému, který je graficky znázorněn. Následuje přesná a jasná definice bodu, přímky a polygonu s obrázky spojených úseček a (ne)platných polygonů. Budou vám popsány obdélníky, křivky a zakřivené povrchy ukázané na obrázcích aproximací křivek.

Následuje specifikace vrcholů, na kterém je mj. ukázáno správné použití funkce knihovny pro vrcholy a také je zmíněna výkonnost této metody. Je vysvětleno kreslení geometrických primitiv ze specifikovaných vrcholů. Také se dozvíme různá omezení těchto vykreslování. Trochu nás autoři vrátí ke správě stavů, kde se dozvíme, jak získávat jednotlivé stavy. Poté následuje zobrazení bodů, přímek a polygonů včetně nastavení jejich vlastností (šířky, vzorů) a nastavování. Dozvíme se, co znamená nastavení stran polygonu a vyřazení odvrácených stran známé též jako „culling“. Následuje výklad normálových vektorů, pole vrcholů („vertex buffers“), včetně podrobného popisu (krok za krokem) jak vykreslit libovolný šestistěn (např. krychli).
Autoři nás seznámí, jakým způsobem dochází k vykreslování jednotlivých vrcholů a jejich spojování. Následují témata o prokládaných polích („interleaved arrays“) spolu se základním popisem jeho mechanismu. Před koncem kapitoly jsou další témata zabývající se polem vrcholů v objektech bufferů (na téma jak snížit počet volání na specifikaci geometrických objektů), aktivací, úpravou či mazání bufferu. Na samém konci jsou rady pro vytváření polygonálních modelů povrchů, ukázky generování dvacetistěnu a výpočtu normálových vektorů povrchu.

Kapitola 3

Hlavním tématem této kapitoly jsou transformace. Je nám vysvětlen pohled na scénu s porovnáním analogií fotoaparátu. Následuje detailní popis jednotlivých kroků transformací vrcholů s příkladem kreslení krychle. Jsou vysvětleny pojmy pohledových, modelovacích a projekčních transformací a uvedeny obecné příkazy pro transformaci. Pokračuje popis pevného souřadnicového systému s možností posunu lokálního systému souřadnic. U modelovací transformace jsou již tradičně popisovány tři pohyby: posun, rotace a velikost.
Zjistíme, co je ortografická projekce, jak definovat zobrazovací okno, transformovat souřadnice hloubky a další zajímavá témata. Autoři nás upozorní na problémy s transformacemi, ukáží jak manipulovat se zásobníkem matic. Před koncem následuje ukázka kombinace všech doposud zmíněných transformací, čímž si vytvoříme jednoduchou sluneční soustavu, anebo třeba simulaci kloubové paže robota.
Pozn.: Přestože na grafice je vidět barevný obrázek, v knize je černobílý.

Kapitola 4

Čtvrtá kapitola je ve znamení barev. Autoři nás informují o způsobu vnímání barev člověkem, o počítačových barvách a o RBGA modelu versus indexovaná barva. Vše je detailně zpracováno na velmi názorných obrázcích. Vysvětlování pokračuje v určení barvy a modelu stínování.

Kapitola 5

Tato kapitola se zabývá neméně důležitou částí – osvětlením. Dozvíme se, jak odstraňovat skryté povrchy, jsou nám popsány osvětlení v reálném světě s analogií v OpenGL. Zmíněny jsou např. ambientní, difuzní, zrcadlová a vyzářená světla. Na příkladu je ukázáno, jak vytvořit osvětlenou kouli. Následují témata, která specifikují jednotlivá světla, tedy například barvu, útlum a umístění, bodová povaha světla, vícenásobná světla, řízní pozice a směru světla.
Naučíme se jak s jednotlivými světly pracovat, jak je zapínat a vypínat, na které prvky se hodí jaká světla. Součástí světel pochopitelně musí být výklad materiálů a ani zde tomu není jinak. Autoři vysvětlí povahy materiálů v závislosti na typu zvolených světel, vlastnosti, barvy a vyzařování. Kapitolu víceméně ukončuje matematický výklad osvětlení, kde se dozvíte mj. o faktoru útlumu či efektu bodového světla.

Kapitola 6

Nyní již známe všechny základní a zároveň nejdůležitější vlastnosti pro práci s grafikou. Šestá kapitola je tak trochu mixem všech znalostí, které právě zúročíme na vysvětlovaných tématech, kterými jsou: míchání barev a antialiasing. Antialiasing je předveden v módu RGBA i indexové barvy. Dalším velkým tématem je mlha. Všechna témata jsou obsáhlá a postupně vysvětlují jejich použití. Ke správnému pochopení napomáhají obrázky a zdrojový kód, kterého je dostatek.

Kapitola 7

Sedmá kapitola se zaměřila výhradně na zobrazovací seznamy. Je zde zmíněn důvod, proč je používat a zárověň ukázán příklad použití. Výklad pokračuje s filosofií designu zobrazovacích seznamů a ukázkou vytvoření a provedení zobrazovacího seznamu, včetně ukázky vykonávání vícenásobných zobrazovacích seznamů.

Kapitola 8

V této kapitole se dozvíme, jak pracovat s bitovými mapami a fonty. Tedy zmínka o rastrovaných pozicích, popis fontů, kreslení, výběr barvy a spojení témata fontů se zobrazovacími seznamy. U obrázků je uvedeno, jaký způsobem číst, zapisovat a kopírovat pixelová data. Jsou popsány tři základní příkazy pro manipulaci s obrázkovými daty. Dále se dozvíme se, jak využívat buffery a jak načítat pixelová data z paměti procesoru do bufferu. A další obsáhlá témata, zabývající se konvolucí, maticí barvy či užitečnými tipy, jak zlepšit výkon renderovaných pixelů.

Kapitola 9

Je v duchu mapování textur, tedy opět po popisu a vlastně smyslu mapování následuje postup jednotlivých kroků mapování. Vše je demonstrováno na příkladech a vysvětleno na obrázcích. Další témata jsou nahrazení textury nebo její části a popis jednorozměrných a trojrozměrných textur. Dozvíme se, jaké jsou módy uložení pro textury a také smysl a použití komprimace textur.
Dalším velice zajímavým tématem jsou mipmapy, které nám umožní více detailů bližších objektů. Součástí výkladu mipmapy jsou úrovně řízení detailů, výpočetní úrovně, automatické generování. Důležitým tématem je filtrování, kde nám autoři popíší způsob a možnosti filtrování. Zbytek se podrobně věnuje objektům textur, jejich vytvoření a použití. Dále texturovací funkce, výpočet vhodných souřadnic textur nebo automatické generování souřadnic textur. Autoři vysvětlují multitexturování, funkce kombinující textury a další pokročilejší témata.

Kapitola 10

V desáté kapitole si rozšíříme obzor o další vlastnosti bufferů. Podrobně si vysvětlíme, jak buffery používat pro efekty např. vyhlazení scény, rozostření pohybu či hloubkovou ostrost. Jsou vysvětleny testy ořezu, alfa-test, stencil-test, který je včetně ukázky použití. Následuje krátká zmínka o stínech (přesněji měkkých stínech), kterým se ale věnuje kniha později.

Kapitola 11

Jedenáctá kapitola vysvětluje jak vytvářet objekty kvadrik k renderování a modelování povrchů (např. koulí, válců), a také teselovat disky (kruhy) a části disků (výseče). Pokud vám pojmy kvadriky a teselátory nejsou známé, nezoufejte, autoři je poměrně důkladně vysvětlí. Vysvětlování pokračuje ukázkou vytvoření teselačního objektu, procedury zpětného volání, vlastností teselace. U kvadrik je vysvětleno, jak renderovat koule, válce a disky.

Kapitola 12

Tématem dvanácté kapitoly jsou evalátory a NURBS. Vysvětluje jednorozměrné evalátory a dvojrozměrné evalátory. Součásti jsou ukázky pro Beziérovu křivku, resp. Beziérovu plochu. Následuje příklad s ukázkou použití evalátorů pro textury. Kniha pokračuje vysvětlením rozhraní GLU NURBS, jeho jednoduchým příkladem, obsluhou objektu NURBS, vytvářením křivky nebo plochy, získáváním primitiv s teselátory NURBS. A výklad ukončuje ukázkou ořezem plochy NURBS.

Kapitola 13

Třináctá kapitola se zabývá možností zásahu uživatele do aplikace, tedy výběrem a zpětnou vazbou. Příkladem může být možnost vybrat na obrazovce oblast nebo nakreslený objekt. Jsou vysvětleny základní kroky, vytvoření zásobníku jmen, záznam zásahů a nakonec samotný kód ukazující příklad výběru. Dále jsou ukázány různé modely zaměření (např. kurzorem myši) a tato část je nakonec shrnuta radami autorů. Druhou významnou podkapitolou je zpětná vazba.

Kapitola 14

Předposlední, čtrnáctá, kapitola již nemá žádné předem dané cíle. Obsahuje mnoho témat, které jsou spíše doporučením a inspirací. Příkladem mohou být témata zpracování chyb, zjišťování verze OpenGL, rozšíření standardů, průsvitnost, mizení vzorků, nebo třeba efekt mizení polygonů. Opět jsou rozšiřovány znalosti o bufferech, antialiasingu znaků či mapování textur.

Kapitola 15

Poslední, patnáctá, kapitola se výhradně zaměřuje na OpenGL 2.0 a shadery. Jsou zde vysvětleny spojitosti OpenGL 2.0 spolu se zavedením programovatelného jazyka zpracování vrcholů a fragmentů pomocí shaderů jazyka OpenGL. Výklad se zabývá ukázkovým shaderem, rozhraním OpenGL/GLSL a samotným GLSL. Počínaje tvorbou shaderů, deklarací a inicializací proměnných, agregovanými typy, strukturami, přístupem k elementům ve vektorech a maticích, poli, modifikátory aj. Dále pokračuje přístupem k texturám v shaderech, specifiky vertex-shaderů a konče fragment-shadery.

Příloha A

Nazvaná „pořadí operací“ se zabývá popisem všech operací, které probíhají od počáteční specifikace vrcholů až po závěrečný zápis fragmentů do frame-bufferu.

Příloha B

Tématem této přílohy jsou stavové proměnné. Mimo jiné jsou na cca dvaceti stranách popsány pole vrcholů, barvy, transformace, osvětlení, pasterizace, multisampling, texturování, operace na fragmentech, pixely, řízení bufferů, evaluátory, dat stavových proměnných včetně popisu, počátečních hodnot (případně minimálních hodnot), samotného dotazovacího příkazu a atributové skupiny.

Příloha C

Zaměřuje se na OpenGL a systémy oken. Je tedy souhrnem funkcí pro práci pod různými systémy za použití rozšíření GLX, AGL, PGL a WGL.

Příloha D

Pojednává o základech GLUT, který je nástrojem pro práci s utilitami OpenGL. Popisuje inicializaci okna, zpracování událostí okna a vstupu, řízení procesu na pozadí aj.

Příloha E

Zabývá se výpočtem normálových vektorů, tedy především hledáním normál u analytických povrchů a normál z polygonálních dat.

Příloha F

Je souhrnem nejdůležitějších údajů o homogenní souřadnici a transformačních matic.

Příloha G

Předkládá tipy pro programování, tedy zmínky o výkonnosti jednotlivých funkcí, kontrolu chyb aj.

Příloha H

Předposlední, dvoustránková, příloha popisuje invarianci OpenGL.

Příloha I

Poslední příloha je zaměřena na shadery, a tedy popisuje proměnné vstupních atributů vertex-shaderů různých typů a stavů.


Máme za sebou stručný přehled jednotlivých kapitol a příloh. Pokud vás zajímá bližší přehled kapitol, můžete nahlédnout do obsahu [ http://knihy.cpress.cz/DataFiles/Book/00001819/Download/obsah_K1198.pdf ]. V případě bližšího zájmu o tuto literaturu doporučuji zajít do vámi oblíbeného knihkupectví a tam si knihu prolistovat.

Zdrojové kódy

Přílohou této knihy není žádné CD ani DVD. Proto jsou zdrojové kódy dostupné na oficiálních webových stránkách [ http://www.knihy.cpress.cz/Pocitac/BookDoc.asp?DocID=0&BookID=1819&DownloadSection=2 ] knihy českého nakladatelství Computer Press.

Autoři

Autoři jsou Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis, přičemž Dave Shreiner pracuje jako vývojář OpenGL u SGI, kde je činný již od zrození OpenGL. Počítačová grafika je jeho oborem přes patnáct let. Vystupuje se svými příspěvky na SIGGRAPHu a dalších konferencích po celém světě, je spoluautorem knihy OpenGL Reference Manual [ http://www.amazon.com/OpenGL-Reference-Manual-Official-Document/dp/0201657651 ].

Shrnutí a hodnocení

Jak se dalo předpokládat, jedná se o velmi dobře zpracovanou knihu a navíc k celkovému dojmu přispívá prakticky bezchybná česká lokalizace. Chcete-li se o OpenGL dozvědět více v přehledné a ucelené formě, navíc v českém jazyce, tato kniha je prakticky jediným kvalitním řešením.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2007020701-opengl-pruvodce-programatora/ ].