KATEDRA INFORMATIKY. Demonstrace OpenGL v prostředí LispWorks

Podobné dokumenty
Návod k použití softwaru Solar Viewer 3D

Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

27. listopadu 2013, Brno Připravil: David Procházka

Programování v jazyku LOGO - úvod

DATOVÉ FORMÁTY GRAFIKY, JEJICH SPECIFIKA A MOŽNOSTI VYUŽITÍ

Závěrečná práce. AutoCAD Inventor (Zadání D1)

Připravil: David Procházka. Projekce

Uživatelský manuál. Aplikace GraphViewer. Vytvořil: Viktor Dlouhý

Připravil: David Procházka. Základy OpenGL

Zobrazování bannerů podporují pouze nově vytvořené šablony motivů vzhledu.

Formulář pro křížový filtr

Rozšíření bakalářské práce

pro začátečníky pro pokročilé na místě (dle požadavků zákazníka)

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

Barvy a barevné modely. Počítačová grafika

UniLog-D. v1.01 návod k obsluze software. Strana 1

Manuál k programu IDP 1.0

Připravil: David Procházka. Vykreslování grafických primitiv

Reliance 3 design OBSAH

Novinky v Solid Edge ST7

1. Nastavení dokumentu

Programátorská dokumentace

SOFTWARE NA ZPRACOVÁNÍ MRAČEN BODŮ Z LASEROVÉHO SKENOVÁNÍ. Martin Štroner, Bronislav Koska 1

ak. rok 2013/2014 Michal Španěl,

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Název: VY_32_INOVACE_PG3315 Umisťování textur pomocí modifikátoru UVW Map. Vzdělávací oblast / téma: 3D grafika, počítačová grafika, 3DS Max

Reflections, refractions, interreflections

Připravil: David Procházka. Vertex Buffer Objects

Počítačová grafika SZŠ A VOŠZ MERHAUTOVA 15, BRNO

Začínáme pracovat s tabulkovým procesorem MS Excel

Stručný postup k použití programu PL7 Junior (programování TSX Micro)

Vytvoření a úpravy geologického modelu

Úloha 1. Text úlohy. Vyberte jednu z nabízených možností: NEPRAVDA. PRAVDA Úloha 2. Text úlohy

MS Word. verze Přehled programů pro úpravu textu

StatSoft Jak vyzrát na datum

Windows - základy. Hlavním vypínačem na základní jednotce. K datům uloženým do výchozí složky.

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

Vektorové grafické formáty

FORTANNS. 22. února 2010

Manuál k programu KaraokeEditor

TECHNOLOGIE ELASTICKÉ KONFORMNÍ TRANSFORMACE RASTROVÝCH OBRAZŮ

Úvod. Program ZK EANPRINT. Základní vlastnosti programu. Co program vyžaduje. Určení programu. Jak program spustit. Uživatelská dokumentace programu

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Souřadnicové prostory

KAPITOLA 4 ZPRACOVÁNÍ TEXTU

Co je nového v aplikaci PaperPort 12?

Comenius Logo. Úterý 20. března. Princip programování. Prostředí Comenius Logo

Archive Player Divar Series. Návod k obsluze

43 HTML šablony. Záložka Šablony v systému

Osvětlování a stínování

APS mini.ed programová nadstavba pro základní vyhodnocení docházky. Příručka uživatele verze

Mapová aplikace HZS Ústeckého kraje

Úvod do počítačové grafiky

Prostředí Microstationu a jeho nastavení. Nastavení výkresu

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

MS SQL Server 2008 Management Studio Tutoriál

Název: VY_32_INOVACE_PG3311 Kamera a její použití, světelné efekty. Vzdělávací oblast / téma: 3D grafika, počítačová grafika, 3DS Max

Styly odstavců. Word Přiřazení stylu odstavce odstavci. Změna stylu odstavce

DUM 06 téma: Tvorba makra pomocí VBA

Práce s texty, Transformace rastru, Připojení GPS

1. Úvod do obsluhy AutoCADu

Vzorce. StatSoft. Vzorce. Kde všude se dá zadat vzorec

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Manuál k ovládání aplikace INFOwin.

CARAT Fórum května 2017 TIPY & TRIKY

Dílčí projekt: Systém projektování textilních struktur 1.etapa: tvorba systému projektování vlákno - příze - tkanina

OPERAČNÍ SYSTÉM. základní ovládání. Mgr. Jan Veverka Střední odborná škola sociální obor ošetřovatel

Geometrické algoritmy pro počítačovou grafiku

František Hudek. červenec 2012

Základní techniky zobrazování Josef Pelikán, MFF UK Praha

Comenius Logo. Princip programování. Prostředí Comenius Logo

UNIVERZITA PARDUBICE Fakulta elektrotechniky a informatiky Katedra softwarových technologií

VYUŽITÍ POČÍTAČOVÉ GRAFIKY

1 Webový server, instalace PHP a MySQL 13

Android OpenGL. Pokročilé shadery

Tisk map z LPIS - rozšířené

Formátování pomocí stylů

SCHÉMA aplikace ObčanServer 2 MENU aplikace Mapové kompozice

Aplikované úlohy Solid Edge. SPŠSE a VOŠ Liberec. Ing. Jan Boháček [ÚLOHA 23 FORMÁT SOUČÁSTI]

Popis programu: Popis přípon důležitých souborů: *.qpf projektový soubor Quartusu

Název: VY_32_INOVACE_PG3314 Rendering - vykreslení vytvořené scény. Vzdělávací oblast / téma: 3D grafika, počítačová grafika, 3DS Max

Controlweb. Úvod. Specifikace systému

Předpoklady správného fungování formulářů

Možnosti tisku v MarushkaDesignu

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Č í sla slovy 1.3. verze dokumentu: vytvořil: Ing. Pavel Randák předmět: Uživatelský manuál vydavatel: Austro-Bohemia, s.r.o.

Satori. Uživatelský manuál

SignEditor 1 - návod k použití

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

František Hudek. červen ročník

11 Zobrazování objektů 3D grafiky

Copyright 2013 Martin Kaňka;

VoiceOver v ios s QWERTY klávesnicí

Uživatelská příručka.!instalace!průvodce.!dialogová okna!program zevnitř

Aplikační profily v PLC Tecomat

CZ.1.07/2.2.00/ )

MS PowerPoint ZÁKLADY

Nápověda k aplikaci EA Script Engine

Transkript:

PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITY PALACKÉHO KATEDRA INFORMATIKY BAKALÁŘSKÁ PRÁCE Demonstrace OpenGL v prostředí LispWorks 2014 Martin Křetínský

Anotace Pojem OpenGL je v moderní počítačové grafice velmi známý a rozšířený. V mojí bakalářské práci chci představit implementaci OpenGL v netradičním vývojovém prostředí LispWorks. Toto vývojové prostředí se hojně využívá k výuce programování a proto si myslím, že rozšíření o možnosti 3D grafiky studenti uvítají.

Tímto bych chtěl poděkovat vedoucímu této bakalářské práce doc. RNDr. Michalu Krupkovi, Ph.D., za vstřícné jednání a odbornou pomoc. Dále svojí rodině, zejména manželce, za trpělivost a podporu.

Obsah 1. OpenGL v LispWorks 7 1.1. Instalace LispWorks.......................... 7 1.2. Implementace OpenGL v LispWorks................ 7 1.3. Zdrojové soubory z adresáře opengl................. 8 1.4. Další možnost implementace...................... 9 2. Program DemonstraceOpenGL 10 2.1. Instalace................................ 10 2.2. Spuštění programu.......................... 10 2.3. Popis programu............................ 10 2.4. Demonstrační příklady........................ 15 2.5. Programátorská dokumentace.................... 16 3. OpenGL 19 3.1. Co je OpenGL?............................ 19 3.2. Datové typy a konvence názvů.................... 19 3.3. Princip práce OpenGL........................ 20 3.4. Definice primitiv........................... 22 3.5. Geometrické transformace...................... 23 3.6. Osvětlení............................... 24 3.7. Texturování.............................. 26 Závěr 30 Reference 31 A. Tvary, konstanty a příkazy 32 B. Obsah přiloženého CD 35 4

Seznam obrázků 1. Okno programu DemonstraceOpenGL................ 11 2. Princip práce OpenGL. Zdroj [5].................. 21 3. Módy zadávání primitiv........................ 23 5

Seznam tabulek 1. Použití kláves............................. 12 2. Datové typy............................... 20 3. Tvary příkazu ZAČÍT-TVAR.................... 32 4. Seznam příkazů............................ 33 5. Barvy................................. 34 6

1. OpenGL v LispWorks 1.1. Instalace LispWorks Vývojové prostředí LispWorks je multiplatformní nástroj pro vývoj software. K dispozici je webových stránkách www.lispworks.com v sekci Downloads. Bezplatná verze má název LispWorks Personal Edition a je k dispozici pro platformy: Windows, Macintosh, Linux, FreeBSD a x86/x64 Solaris. Bezplatné stažení je podmíněno vložením platné emailové adresy. Vzhledem k tomu, že vlastním počítač s operačním systémem Windows, zvolil jsem pro svoji bakalářskou práci verzi pro systém Windows. V této edici je ovšem k dispozici pouze 32-bitová verze s označením LispWorks Personal Edition 6.0.1. Po vyplnění jednoduchého formuláře jsem si stáhnul soubor LispWorksPersonal61.exe o velikosti 46,2 MB. Je to standardní instalátor a po jeho spuštění jsem si do počítače nainstaloval toto vývojové prostředí. Toto je v podstatě jediná podmínka pro běh programu DemonstraceOpenGL, který jsem vytvořil jako téma bakalářské práce. 1.2. Implementace OpenGL v LispWorks Součástí standardní instalace LispWorks je adresář examples\opengl. V tomto adresáři jsou zdrojové kódy pro implementaci OpenGL do prostředí LispWorks. Aby bylo možné používat funkce OpenGL je nutné otevřít a zkompilovat soubor load.lisp z výše uvedeného adresáře. Druhou možností, kterou jsem použil ve své práci já, je na začátku zdrojového souboru použít příkaz: (load (format nil alib\6-0-0-0\examples\opengl\load.lisp *lispworks-directory*)) Dále je možné použít příkaz (use-package opengl), pro psaní názvů funkcí a konstant bez specifikace balíku opengl. Datové typy Protože Common Lisp patří mezi slabě typované jazyky, je nutné dávat pozor na správné datové typy parametrů volaných funkcí. OpenGL používá vlastní datové typy jejich konverze může být zdrojem chyb. Názvy funkcí a konstant Vzhledem k tomu, že prostředí LispWorks není case-sensitive, tj. nerozlišují se malá a velká písmena, je konvence pro psaní názvů funkcí a konstant následující. Předpona gl zůstává. Kde je ve specifikaci OpenGL velké písmeno, tak v LispWorks je před písmenem pomlčka. Například funkce v OpenGL glvertex3f() v LispWorks (gl-vertex3-f). Z předchozího příkladu je patrné, že pomlčka se dává také před zkratku datového typu. 7

CAPI interface Pro vykreslování scén je v balíku implemnetována třída OPENGL:OPENGL- PANE, která je podtřídou CAPI:OUTPU-PANE. Volání funkcí pro kreslení musí být uvnitř makra opengl:rendering-on. Tedy takto: (OPENGL:RENDERING-ON (OPENGL-PANE) <příkazy opengl>) Pro správné vykreslení musí posledním příkazem uvnitř tohoto makra být (opengl:gl-flush). Pokud je použitý dvojí buffer pro openglpane, ještě za příkazem gl-flush, musí být prohození bufferů příkazem (opengl:swap-buffers opengl-pane). 1.3. Zdrojové soubory z adresáře opengl V této části bych se chtěl věnovat souborům v adresáři examples\opengl resp. obzvláště těm s příponou.lisp. Tyto soubory obsahují spoustu užitečných informací a já jsem z nich při psaní této práce čerpal. doc.txt V tomto souboru je popsána instalace, CAPI rozhraní, konfigurace opengl okna a názvy funkcí. Je v angličtině a popisuje v podstatě to, co jsem psal v předchozí sekci v odstavci CAPI interface. constants.lisp Obsahuje definice všech konstant použitých v balíku opengl. fns.lisp V tomto souboru jsou definice veškerých funkcí včetně jejich syntaxe a typů parametrů. Často jsem jej využíval pro vyhledání správného tvaru příkazu. ufns.lisp Zde je možné nalézt vybrané funkce z knihovny GLU (Graphics Library Utility). V mojí práci využívám příkazu (glu-perspective) k nastavení perspektivního zobrazení a příkaz (glu-look-at) pro nastavení kamery. Použití těchto příkazů je snadnější a intuitivnější, než přímé nastavení projekční matice *GL-PROJECTION*. vectors.lisp Protože parametrem mnoha příkazů opengl je ukazatel (pointer) na pole tzv. gl-vector, v tomto souboru jsou užitečné informace, jak tuto strukturu vytvořit - příkaz (make-gl-vector) a příkaz pro přístup k prvkům tohoto jednorozměrného pole (gl-vector-aref). Ve své práci tyto příkazy používám pro uložení textury, pozici světla, nastavení světelného zdroje apod. 8

1.4. Další možnost implementace. Je možná další implementace OpenGL včetně balíků GLU (Graphics Library Utility) a GLUT (Graphics Library Utility Toolkit). Pro načtení do LispWorks je pořeba dalších balíků. Jsou to ASDF (Another System Definition Facility), Alexandria (portable public domain utiliy), Babel (charset encoding/decoding library), CFFI (Common Foreign Functions Interface), Trivialfeatures a cl-opengl(balík obsahuje i GLU a GLUT). Výhodou je možnost využití i balíků GLU a GLUT, které umožňují např. celoobrazovkový režim apod. Ovšem potřeba tolika výše uvedených balíků mě odradila od použití v této bakalářské práci. Program je určen pro žáky středních škol, a proto si myslím, že tato možnost je spíše pro odborníky. Tolik k implementaci OpenGL v prostředí LispWorks. Bohužel, v manuálech k LispWorks nejsou téměř žádné informace k této problematice. Vše, co jsem popsal v této sekci, jsem načerpal až při práci na této bakalářské práci. 9

2. Program DemonstraceOpenGL Ve druhé části se věnuji programu, který je určen studentům středních škol pro jednoduchou prezentaci OpenGL. Program jsem vytvářel a testoval v prostředí MS Windows. Nicméně většina kódu byla částečně otestována i na počítači Macintosh. 2.1. Instalace Program DemonstraceOpenGL není nutné instalovat. Je distribuován jako zdrojový soubor DemonstraceOpenGL.lisp. Pokud tedy byla provedena instalace LispWorks viz. Instalace LispWorks, je možné tento soubor otevřít přímo ve vývojovém prostředí (volba File->Open) a zkompilovat (volba Works->Buffers- >Compile). Součástí je i soubor help.html, který je potřeba umístit do složky se zdrojovým souborem. 2.2. Spuštění programu Po kompilaci zdrojového souboru DemonstraceOpenGL je možné program spustit zadáním příkazu (spustit-demonstraci). Příkaz se standardně zadává v okně Listeneru. Součástí kompilace programu je i načtení a kompilace balíku opengl. 2.3. Popis programu Po spuštění příkazu (spustit-demonstraci) se objeví hlavní okno programu, jak ukazuje následující obrázek. 10

Obrázek 1. Okno programu DemonstraceOpenGL Okno programu je rozděleno na dvě části. V levé části je umístěno vykreslovací okno opengl a v pravé části je pět záložek s nastavením. Názvy záložek korespondují s pěti prvky systému OpenGL, které jsem vybral pro prezentaci grafické knihovny. První dvě záložky Vertexy a Transformace jsou věnovány tvorbě scény, ostatní potom ovlivňují vykreslenou scénu. V horní části okna je standardní menu. Menu Soubor obsahuje položky pro ukládání, či načítání do souboru. Editace obsahuje standardní položky pro editaci. V menu Panely je možné přepínat jednotlivé panely a v poslední položce Nápověda jsou informace o programu a nápověda k programu. Nápověda k programu je dodávána společně se zdrojovým souborem a v případě nenalezení souboru help.html se zobrazí dialogové okno pro vyhledání tohoto souboru. Vykreslovací okno slouží ke zobrazení scény, která je definovaná a nastavená v záložkách. Ve spodní části okna jsou informace o pozici kamery a směru pohledu. Pozici kamery i směr pohledu je možné v tomto okně měnit pomocí klávesnice a myši jak ukazuje následující tabulka. 11

Klávesa w nebo šipka nahoru s nebo šipka dolů a nebo šipka vlevo d nebo šipka vpravo PgUp PgDn c x levé tlačítko myši + pohyb pravé tlačítko myši + pohyb Popis pohyb kamery vpřed pohyb kamery vzad pohyb kamery vlevo pohyb kamery vpravo pohyb kamery vzhůru pohyb kamery dolů defaultní nastavení kamery defaultní nastavení světla rozlížení změna pozice světla ve směru x,y Tabulka 1. Použití kláves Nyní k jednotlivým záložkám: Vertexy Tato část se věnuje zadávání grafických primitiv. Jednotlivá primitiva lze vybrat z rozbalovacího seznamu ZAČÍT-TVAR. Výběr tvaru je oznámen v editačním okně, pod rozbalovacími tlačítky. Dále je možno pokračovat zadáním vrcholu (tzv. vertex), barvy, normály, nebo kotvy textury. Zadání vrcholu: - příkaz ZADAT-VRCHOL - má tři parametry x, y, z. Označují tři souřadnice v prostoru a podmínkou je, že mají všechny tři stejný datový typ: bud integer, nebo float. Zadání barvy: - příkaz ZADAT-BARVU - opět má tři parametry r, g, b. Hodnoty parametrů jsou v rozmezí 0-255 a označují RGB hodnotu barvy. Zadání normály: - příkaz ZADAT-NORMÁLU - má tři parametry x, y, z. Podmínky jsou stejné jako u příkazu ZADAT-VRCHOL. Zadání kotvy textury: - příkaz ZADAT-KOTVU-TEXTURY - má dva parametry s, t. Protože je v programu použita jedna dvojrozměrná textura, jsou parametry pouze dva s pozice ve směru osy x a t pozice ve směru osy y. Po zadání jedné z výše uvedených vlastností, je možné tuto vlastnost přidat do editačního okna tlačítkem Přidat. Po zadání vlastností celého primitiva, je potřeba stisknutím tlačítka UKONČIT-TVAR, toto primitivum ukončit. Vykreslení řetězce je možné vyvolat stiskem tlačítka Vykreslit. Editační okno - zde je možné nejen sledovat to, co jste zadali výše uvedenými tlačítky, ale také editovat příkazy v něm uvedené popř. přímo psát příkazy bez použití výše uvedených tlačítek. Možnost přímé editace pravděpodobně více využijí uživatelé, kteří už s tímto programem mají zkušenosti. 12

Příkazy je možno psát bez závorek, nebo i s nimi (jako v Lispu). V případě psaní kódu bez závorek je nutné psát každý příkaz na samostatný řádek. Příkazy skriptu je ovšem nutno psát velkými písmeny, protože prostředí převádí malá písmena na velká. V případě české diakritiky je převod chybný, či žádný. V příloze A jsou uvedeny všechny příkazy, barvy i tvary použitelné v editačním okně. Editační okno ovšem akceptuje i jiné příkazy a to jak příkazy opengl např.: (gl-enable *gl-lighting*), tak i příkazy Common Lispu. Ovšem příkazy Common Lispu doporučuji psát se závorkami. Je možné i použití komentářů. Komentáře pište na samostané řádky a začínají znakem ; - středník. Transformace Na této záložce je možné zadávat příkazy pro posunutí, rotaci a změnu měřítka. Postup je takový, že z rozbalovacího seznamu je možné vybrat transformaci, zadat parametry do boxů úhel, x, y, z a přidat do vykreslovacího řetězce tlačítkem Přidat. Parametry je nutno opět zadat třemi, popř. čtyřmi čísly stejného datového typu. Zde pouze jedno malé upozornění. Záleží na pořadí prováděných transformací: posloupnost rotace -> posunutí není to stejné jako posunutí -> rotace i když oba příkazy mají stejné parametry! Viz. kapitola Geometrické transformace Projekce a Test hloubky Pomocí voleb na této záložce je možné měnit projekční matici *GL-PROJECTION*. Defaultně je v programu nastavena perspektivní projekce. Čísla vyjadřují průnik osy s ořezovou rovinou, tj. bližší, vzdálenější s osou z, levá, pravá s osou x, horní, dolní s osou y. Pro nastavení perspektivní projekce jsem použil příkaz (glu-perspective), proto se zadává jen zorný úhel, bližší a vzdálenější ořezová rovina. Použití tohoto příkazu je více intuitivní, než při použití příkazu (gl-frustum). Ortogonální, neboli kolmé zobrazení nastavuji příkazem (gl-ortho) a tudíž je nutné definovat všech šest ořezových rovin. Tvar prostoru definovaného perspektivní projekcí má tvar komolého čtyřbokého jehlanu, kde menší podstava je bližší (near) ořezová rovina a větší podstava je vzdálenější (far) ořezová rovina. U ortogonální (kolmé) projekce má prostor tvar kvádru. Pozor - změna projekční matice u již vykreslené scény může způsobit změnu definovaného prostoru a tím pádem nemusí být objekty správně vykresleny! Vrcholy objektů, které jsou mimo definovaný prostor, se samozřejmě nevykreslují. Test hloubky - použitím volby Povolit/Zakázat se systému OpenGL říká, jestli má u každého obrazového fragmentu testovat jeho vzdálenost od projekční roviny. Tato vzdálenost (resp. převrácená hodnota) je uložena 13

v tzv. depth bufferu. Pokud je test hloubky zakázán, jsou stěny objektů vykreslovány v tom pořadí, jak jsou zadány v editačním okně. Následkem toho, se nemusí stěny těles ve scéně správně překrývat. Při každém překreslení scény by se tyto stěny musely seřadit od nejvzdálenější po nejbližší. Proto byl do OpenGL implementován depth buffer a při vykreslování se kontroluje vzdálenost každého obrazového elementu. Pokud před vykreslením elementu do barvového bufferu, tento element projde testem hloubky, je vykreslen. V opačném případě je z dalšího zpracování vyloučen. Pokud je tedy test hloubky zapnutý, jsou všechna tělesa vykreslena správně. Světlo Zde je možné povolit, nebo zakázat použití osvětlení ve scéně. V mém programu je použito pouze jedno světlo, i když OpenGL disponuje až osmi světly. Značí se LIGHT0 - LIGHT7, dle implementace OpenGL jich ovšem může být i více. Před použitím osvětlení je nutné pro každou plošku tělesa definovat normálový vektor, tj. vektor, který je kolmý k této plošce. Směr tohoto vektoru udává, která strana plošky je přední. V mém programu není nutné tento vektor normalizovat, jelikož jsem ve vykreslovací funkci povolil automatickou normalizaci příkazem (gl-enable *gl-normalize*). Nicméně u složitějších těles ve scéně by tato automatická normalizace mohla způsobit pomalejší vykreslení, proto se doporučuje normalizovat vektory před samotným vykreslením těles a automatickou normalizaci nepoužívat. Dále je na výběr použití stínování. Ploché stínování znamená, že se celá ploška vykreslí jednou barvou, která je pro tuto plošku vypočtena. Naopak u Goraudova stínování jsou spočteny barvy pro jednotlivé vrcholy plošky a ta je vykreslena přechodem mezi barvami pro tyto vrcholy. Goraudovo stínování je tedy bližší reálnému osvětlení. Další vlastností zdroje světla, kterou jsem do programu začlenil, je to, zda se jedná o bodové, či směrové světlo. Bodové světlo si můžeme představit, jako žárovku v místnosti. Paprsky světla vychází jakoby z jednoho bodu, který je relativně blízko osvětlené scény. Má určitě jiné vlastnosti než osvětlení směrové, které si můžeme připodobnit k osvětlení od okna v místnosti. Pochází z jednoho směru a není možné určit přesně bod odkud se šíří. Pro nastavení rozdílu mezi bodovým a směrovým světlem se používá toho faktu, že pokud pozici světla určuje bod, jedná se o bodové, pokud vektor, jedná se o směrové. Zadání pozice světla určují čtyři souřadnice (tzv. homogenní souřadnice) x, y, z, w, kde právě w určuje, zda se jedná o bod, nebo o vektor. Když je w nastaveno na jedničku tj. x, y, z, 1, jedná se o bod, když na nulu tj. x, y, z, 0 jedná se o vektor. Zadání pozice světla je možné přímo vložením hodnot do polí v programu, nebo je možné světlo přesouvat pohybem myši se současně stisknutým pravým tlačítkem myši. Myší se mění souřadnice ve směru os x a y. 14

Nastavení barev světelného zdroje umožňuje změnit RGB hodnoty každé složky světla. V OpenGL je použit tzv. Phongův osvětlovací model, který sice neumí nastavit světlo tak, jak jej známe z reality, ale není výpočetně náročný. V tomto modelu se světlo na povrchu tělesa rozkládá na tři složky: okolní (ambient), odražené (difuse) a odlesky (specular). Celková intenzita světla se tedy počítá pro každou barevnou složku RGB a je aplikována na každou složku zvlášt. Nastavení barev světelného zdroje má souvislost s dalším nastavením a to barvou materiálu. Pokud je Barva materiálu zakázána je barva ve scéně ovlivněna nastavením světelného zdroje. Pokud je povolena, je barva těles určena příkazem ZADAT-BARVU (popř. (gl-color3-ub)), tak jak je uvedena v editačním okně. Textury Ve své práci používám jednu texturu o velikosti 64x64 pixelů - znázorňuje logo OpenGL. Pro její použití je potřeba na této záložce povolit texturování. Dále pro každý vrchol tělesa, které chceme mít pokryto texturou, je potřeba zadat koordináty do textury příkazem ZADAT-KOTVU-TEXTURY (popř. (gl-texcoord2-f)). Tyto koordináty mají pro dvojrozměrnou texturu souřadnice: 0.0, 0.0 pro levý dolní roh a pro pravý horní roh 1.0, 1.0. Pokud pro pravý horní roh nastavím například koordináty 4.0, 4.0 a bude nastaveno opakování textury, na povrch bude vykresleno 4x4 těchto textur. V případě, že bude nastaveno protažení, nebude protažena celá textura, nýbrž pouze poslední sloupec/řádek pixelů textury. Při nanášení textury na povrch tělesa, je nutné někdy texturu zmenšit jindy zvětšit. Pro tyto operace je v OpenGL definován parametr, který říká jaký filtr se pro tyto operace má použít. Pokud je použit filtr *gl-nearest*, jeví se textura jakoby kostičkovaná. Při použití filtru *gl-linear* se textura zjemní. Proto jsem v programu uvedl možnost zapnout/vypnout zjemnění textury. Veškerá nastavení provedená na záložkách, včetně obsahu editačního okna je možné uložit do souboru pomocí volby v menu (Soubor -> Uložit jako...). Pomocí volby v menu (Soubor -> Otevřít) lze načíst jak obsah editačního okna, ale také nastavení na záložkách. Název souboru je vždy zobrazen v názvu okna programu. Změny v otevřeném souboru je také možné uložit pomocí volby v menu (Soubor - > Uložit). V další části bych se chtěl věnovat demostračním příkladům, které jsou součástí mojí práce. 2.4. Demonstrační příklady Tyto příklady je možné použít přímo v programu Demonstrace OpenGL. Pro načtení souboru použijte v menu položku (Soubor -> Otevřít). 15

1-primitiva.gllisp - tento soubor zobrazí všechna grafická primitiva, která podporuje OpenGL. 2-transformace.gllisp - zde jsou zobrazeny celkem tři jehlany se stejnými souřadnicemi vrcholů. Zelený je bez použití transformací. Poté jsou použity transformace v pořadí posunutí -> rotace a je vykreslen modrý jehlan. Nakonec jsou použity další transformace v pořadí rotace -> posunutí a následně vykreslen červený jehlan. Z tohoto příkladu je vidět, že opravdu záleží na pořadí transformací. 3-kolma-projekce.gllisp - v této ukázce jsou vykresleny 3 krychle různé velikosti, ale se stejným středem. Je nastavena ortogonální projekce a je zde patrné, zvláště při různém nastavení kamery, že nedochází ke zkreslení délek jednotlivých hran krychlí. 4-test-hloubky.gllisp - jsou vykresleny dva jehlany, mají různou vzdálenost a jiné pořadí vykreslování. Se zapnutým testem hloubky je pořadí jehlanů správné, s vypnutým se dříve vykreslí červený, poté zelený. 5-osvetleni.gllisp - v ukázce jsou vykresleny dvě tělesa. Jedno má definovány normály pro každou plochu tělesa a je tudíž v pořádku osvětleno. Druhé těleso (trojboký jehlan postavený na špici) nemá definovány normály. Ve scéně je proto jehlan velmi tmavý (neosvětlený). V ukázce je nastaveno obyčejné bílé světlo. Můžete zkusit měnit hodnoty nastavení barev světelného zdroje. Zkuste povolit/zakázat barvu materiálu. 6-textury.gllisp - v poslední ukázce je vykreslena krychle pokrytá texturou. Každá strana kostky je jinak otexturována. Zkuste vypnout/zapnout zjemnění textury, nebo měnit vlastnosti ve směrech s a t. 2.5. Programátorská dokumentace Celý zdrojový kód je rozdělen do pěti částí: Definice CAPI rozhraní - (capi:define-interface demonstraceopengl (capi:interface) ) - okno, záložky, menu - (defun spustit-demonstraci) - spuštění programu Obsluhy událostí (callbacks) - (defun print-tab-layout-item) - zobrazení názvu záložek - (defmethod select-layout-from-tab-layout-item) - výběr záložky - (defmethod current-view) - nastavení viditelné záložky Menu - (defun novy-callback) - menu - nový soubor 16

- (defun ulozit-callback) - menu - uložit, uložit jako... - (defun nacist-callback) - menu - otevřít Záložka Vertexy - (defun gl-begin-pane-callback) - výběr z rozbalovacího menu Začít-tvar - (defun gl-type-pane-callback) - výběr z rozbalovacího menu zadání vrcholu, apod. - (defun pridat-callback) - kliknutí na tlačítko Přidat - (defun gl-end-callback) - kliknutí na tlačítko Ukončit tvar - (defun vykreslit-callback) - kliknutí na tlačítko Vykreslit - (defun text-pane-change-callback) - změna textu v editačním okně Záložka Transformace - (defun transformace-option-callback) - výběr z rozbalovacího menu Transformace - (defun transformace-pridat-callback) - kliknutí na tlačítko Přidat Záložka Projekce a Test hloubky - (defun depth-test-callback) - Povolit/Zakázat test hloubky - (defun p-radio-callback) - výběr perspektivní projekce - (defun o-radio-callback) - výběr ortogonální projekce - (defun aplikovat-callback) - kliknutí na tlačítko Aplikovat - (defun svetlo-test-callback) - Povolit/Zakázat osvětlení - (defun stinovani-test-callback) - Ploché/Goraudovo stínování - (defun typ-svetla-test-callback) - Bodové/Směrové světlo - (defun barva-svetla-callback) - změna nastavení barev světla - (defun pozice-svetla-callback) - změna pozice světla - (defun barva-materialu-test-callback) - Povolit/Zakázat barvení materiálu Záložka Textury - (defun textury-test-callback) - Povolit/Zakázat texturování Vykreslovací okno OpenGL - (defun on-resize) - obsluha události změna velikosti okna - (defun on-display) - vykreslení řetězce - (defun on-destroy) - obsluha události ukončení okna aplikace Obsluha klávesnice a myši - (defun input) - vstup z klávesnice - (defun l-tlacitko-kamera-pohyb) - levé tlačítko + pohyb - (defun p-tlacitko-svetlo-pohyb) - pravé tlačítko + pohyb - (defun l-tlacitko-mysi) - test na stisknuté levé tlačítko myši - (defun p-tlacitko-mysi) - test na stisknuté pravé tlačítko myši Pomocné funkce - (defun my-eval) - vyhodnocení výrazu s obsluhou chyb - (defun nastavit-panely) - po načtení souboru nastavení záložek - (defun input-to-cislo-callback) - převod vstupu na číslo - (defun string-to-list) - převod textu z editačního okna na list - (defun pridat-do-textu) - přidá příkaz do textu editačního okna 17

- (defun aktualizovat-pomocne-vektory) - aktualizace vektorů r a h - (defun vrat-double) - přetypování na typ double-float, nebo chyba - (defun vrat-single) - přetypování na typ single-float, nebo chyba - (defun vrat-integer) - přetypování na typ integer, nebo chyba - (defun number3p) - testuje 3 parametry, zda jsou čísla - (defun integer2p) - testuje 2 parametry na typ integer - (defun integer3p) - testuje 3 parametry na typ integer - (defun unsigned-byte3p) - testuje 3 parametry, na typ unsigned-byte - (defun float2p) - testuje 2 parametry na typ float - (defun float3p) - testuje 3 parametry na typ float - (defun ulozitp) - dotaz na uložení změn Nápověda - (defun zobraz-napovedu) - zobrazí nápovědu v defaultním prohlížeči - (capi:define-interface O-aplikaci (capi:interface)) - okno O aplikaci - (defun zobraz-o-aplikaci) - zobrazí okno O aplikaci Příkazy skriptovacího jazyka - (defun ZADAT-BARVU) - gl-color3-ub, gl-color3-f - zadání barvy - (defun ZAČÍT-TVAR) - gl-begin tvar - (defun ZADAT-VRCHOL) - gl-vertex3-i, gl-vertex3-f - zadání vrcholu - (defun ZADAT-NORMÁLU) - gl-normal3-f, zadání normály - (defun ZADAT-KOTVU-TEXTURY) - gl-tex-coord2-i, gl-tex-coord2-f - koordináty textury - (defun POSUNUTÍ) - gl-translated - transformace posunutí - (defun ROTACE) - gl-rotatef - transformace rotace - (defun ZMĚNA-MĚŘÍTKA) - gl-scaled - transformace změna měřítka - (defun UKONČIT-TVAR) - gl-end - ukončení zadání tvaru Zdrojový kód dále obsahuje definice proměnných, konstant barev, tvarů a definici textury. 18

3. OpenGL V této části se věnuji stručnému představení grafické knihovny OpenGL. 3.1. Co je OpenGL? OpenGL (Open Graphics Library) je knihovna funkcí pro práci s trojrozměrnou grafikou. Představuje jednotné API (Application Programming Interface) mezi programem a grafickým hardware (grafickou kartou). Hlavním rysem OpenGL je nezávislost na cílové platformě a programovacím jazyku. Knihovna OpenGL vznikla v roce 1992 ve společnosti Silicon Graphics Inc. Jejím předchůdcem byla knihovna IRIS GL, z jehož konceptu OpenGL vychází. Základem tohoto konceptu je proudové zpracování obrazových elementů z nichž je vytvářena trojrozměrná scéna. V současnosti je trojrozměrná grafika široce využívána v různých aplikacích, CAD/CAM inženýrských systémech, virtuální realitě a v počítačových hrách. Standard OpenGL spravuje konsorcium označované jako ARB (Architecture Review Board), jehož členy jsou firmy jako např. NVidia, SGI, Microsoft, AMD apod. Jak plyne z názvu, OpenGL je otevřeným standardem. To znamená, že konsorcium pouze dohlíží, je-li implementace v souladu s jeho specifikací a nestojí nutně za každou realizací OpenGL na určité platformě. Z pohledu programátora je knihovna souborem asi 150 funkcí, které umožňují vytvářet geometrické objekty ve dvou, nebo třech dimenzích. Tyto objekty lze dále zpracovávat. Autor programu nemusí znát konfiguraci počítače, na kterém jeho program bude pracovat. V podstatě lze říci, že programátor pouze zadá vrcholy objektů, popř. jak namapovat textury na tyto objekty a vlastní vykreslení zařídí OpenGL. Je možné dále zapínáním či vypínáním různých voleb OpenGL ovlivňovat vykreslení výsledné scény. Vykreslování scény probíhá procedurálně. Voláním funkcí OpenGL se vykreslí výsledný rastrový obrázek, který je uložen v tzv. framebufferu. Z tohoto framebufferu putují data přímo na zobrazovací zařízení. 3.2. Datové typy a konvence názvů Z důvodu co největší platformové nezávislosti zavádí OpenGL vlastní datové typy. V následující tabulce je uveden přehled základních typů. Pojmenování se řídí konvencí - první dvě písmena jsou GL poté následuje vlastní jméno typu. 19

OpenGL typ odpovídající C typ minimální počet bitů přípona GLbyte signed char 8-bit signed integer b GLshort short 16-bit signed integer s GLint, GLsizei int, long 32-bit signed integer i GLfloat, GLclampf float 32-bit floating point f GLdouble, GLclampd double 64-bit floating point d GLubyte, GLboolean unsigned char 8-bit unsigned integer ub GLushort unsigned short 16-bit unsigned short us GLuint, GLenum unsigned int 32-bit unsigned integer ui GLbitfield unsigned short 32-bit unsigned integer ui Tabulka 2. Datové typy. Podobnou konvenci jako datové typy mají i výčtové typy a funkce. Předpona funkce gl udává knihovnu, ze které pochází. gl - OpenGL, glu - OpenGL Utility Library, glut - OpenGL Utility Toolkit. Některé funkce v OpenGL provádí stejnou činnost, ale přijímají jiný počet parametrů, nebo jsou parametry jiného datového typu apod. Proto je konvence pro pojmenování těchto funkcí následující: předpona gl + název funkce + číslice udávající počet parametrů + písmeno udávající datový typ viz. tabulka 2. + v pokud je uvedeno, ukazatel na pole příslušného rozměru a typu. Například: glvertex3f(glfloat x, GLfloat y, GLfloat z) // tři souřadnice typu float glvertex4i(glint x, GLint y, GLint z, GLint w) // čtyři souřadnice typu integer glvertex2dv(gldouble x, GLdouble y) // dvě souřadnice typu double zadány v poli 3.3. Princip práce OpenGL Vykreslení scény, nebo obrazce do vykreslovacího řetězce (rendering pipeline) OpenGL probíhá tak, že se do tohoto řetězce nahrávají dva typy dat: a) geometrická data - údaje o vrcholech objektů b) rastrová data - bitmapy, pixmapy a textury Tato data se při rasterizaci spojí a dále putují do framebufferu. Z něj potom přímo do zobrazovacího zařízení - monitoru apod. Data uložená ve framebufferu je dále možné číst do paměti procesoru, nebo kombinovat s právě vznikajícím snímkem. Tohoto se využívá pro vykreslení zrcadlících efektů, nebo při tzv. blendingu tj. kreslení průhledných objektů např. pohled ven z okna aj. 20

Následující obrázek přehledně znázorňuje celý proces vykreslení. Obrázek 2. Princip práce OpenGL. Zdroj [5] Vysoké rychlosti vykreslování se dosahuje především tím, že geometrická a rastrová data jsou zpracovávána odděleně, takže mohou pracovat paralelně. Mo-duly na předchozím obrázku mohou pracovat samostatně a jsou řízeny pouze daty. Uvnitř modulů probíhají operace, které je také možné rozdělit na jednodušší úlohy a ty zpracovávat zřetězeně. Všechny tyto vlastnosti umožňují zřetězené zpracování (pipeline) na vysoké úrovni. Tok dat, převážně geometrických, je jednosměrný, takže je možné použít techniku streamingu, čímž dojde ke snížení objemu dat mezi grafickým procesorem a grafickou pamětí. A nyní k jednotlivým modulům na obrázku. 1. Vertex data - jednotlivé vrcholy objektů. U nichž je možno specifikovat barvu (glcolor), normálu (glnormal), texturovací souřadnice (gltexcoord), parametry materiálu (glmaterial) a další. 2. Pixel data - jednobarevné rastrové obrázky (bitmapy) např. písmo, rastrové obrázky s vyšší bitovou hloubkou (pixmapy), textury pro povrch těles. 3. Display list - posloupnost příkazů OpenGL pojmenovaná a uložená v paměti (grafické, nebo hlavní). Jedním příkazem lze tento display list vyvolat. 21

4. Evaluators - použití při vykreslování parametrických ploch. 5. Per-vertex operations and primitive assembly - transformace jednotlivých vertexů pomocí matice ModelView, výpočet osvětlení, vyřazení vertexů, které nebudou vidět z pohledu kamery. 6. Pixel operations - dekódování barev jednotlivých pixelů do interního formátu na grafické kartě, po dekódování jsou pixely bud uloženy do texturovací paměti, nebo poslána dále do rasterizační jednotky. 7. Rasterization - vlastní projekce trojrozměrného obrazu na plochu. 8. Texture assembly - jednoduché operace s texturami; kombinování, mipmapping apod. 9. Per-fragment operations - generování textelů (textel = jeden pixel z textury), výpočet mlhy, antialiasing, blending. 10. Framebuffer - obsahuje barvový buffer (color buffer), buffer hloubky (Z-buffer), buffer šablony (stencil buffer), akumulační buffer (accumulation buffer). Barvových bufferů může být i více např. při doublebufferingu jsou minimálně dva. Jeden z nich vždy představuje to, co je na obrazovce. 3.4. Definice primitiv Základními stavebními prvky z nichž OpenGL vytváří výslednou scénu jsou body, čáry a polygony. Tyto základní prvky se definují v sekci uzavřené funkcemi glbegin() a glend(). Vstupním parametrem funkce glbegin() je konstanta, která určuje jaké primitivum má být vytvořeno. Následující obrázek znázorňuje názvy konstant všech primitiv a způsob jakým jsou vykreslovány. V případě, že je zadán větší počet jednotlivých vrcholů primitiva (vertexů), než je zapotřebí k jeho vykreslení, budou zbylé vrcholy ignorovány. Například pro trojúhelník jsou potřeba 3 vrcholy, pokud budou zadány 4, nebude poslední použit. V této sekci je možné každému vrcholu také přiřadit barvu (funkcí glcolor()), normálový vektor (funkcí glnormal()) nebo nastavení souřadnic textury (funkcí gltexcoord()). 22

Obrázek 3. Módy zadávání primitiv. 3.5. Geometrické transformace Pro pohyb objektů ve scéně, nebo pohyb kamery se využívá transformací. Jsou tři typy transformací: modelovací, zobrazovací a projekční. Modelovací transformace Při transformacích jako posunutí, nebo rotace dochází k manipulaci s vrcholy objektů. K této manipulaci dochází tím, že se násobí vektory souřadnic vrcholů aktuální maticí. Transformační příkazy vynásobí aktuální matici vybranou maticí (např. GL MODELVIEW) a výsledek opět uloží do aktuální matice. Před použitím transformací je vždy potřeba nastavit vybranou matici na jednotkovou (funkcí glloadidentity). Pořadí transformací je velmi důležité; například pořadí rotace->posunutí není to stejné jako posunutí->rotace. Zobrazovací transformace Je možné přirovnat tyto transformace k umístění a rotaci kamery, která snímá danou scénu. Pozice kamery je dána jejími souřadnicemi a vektorem, který určuje směr vzhůru. Imlicitně je nastaven na (0,1,0), tedy ve směru osy y. Posunutí kamery vzad má ve scéně stejný účinek, jako posunutí objektu vpřed. Z toho plyne, že tyto dvě transformace jsou v určitém vztahu. Projekční transformace Jakým způsobem se bude promítat scéna do okna aplikace, respektive jak se bude mapovat do roviny, určuje projekční transformace. V OpenGL jsou známy dva typy projekčních matic: kolmá (ortogonální) a perspektivní. 23

Při kolmé projekci nedochází ke zkreslení délek a rovnoběžky zůstávají rovnoběžné. Toto má využití například v technických aplikacích typu CAD/CAM. Naopak perspektivní projekce nám podává realistický pohled na danou scénu. 3.6. Osvětlení Pro výpočty osvětlení se v OpenGL používá Phongův osvětlovací model. Tento model sice nepodává fyzikálně nejpřesnější výsledky, ale je výpočetně poměrně rychlý a podává poměrně realistické zobrazení scény. Základem je rozdělení světla na tři složky: Ambientní složka - také se označuje jako okolní světlo. Je to světlo, které dopadá na povrch tělesa rovnoměrně ze všech stran. Toto světlo není vyzařováno ze žádného zdroje, vzniká odrazem světla od okolních těles, stěn apod. Tělesa osvětlená pouze ambientní složkou světla se jeví jakoby plochá, bez prostorového vjemu. Difúzní složka - toto světlo dopadá na povrch tělesa z konkrétního zdroje a od povrchu se odráží všemi směry se stejnou intenzitou. Také se označuje jako odražené světlo. Těleso osvětlené pouze difúzní složkou se jeví prostorově, ale je matné. Proto se toto světlo používá k vykreslení matných povrchů. Spekulární složka - také se označuje jako odlesky. Jde o světlo, které je vyzařováno z určitého zdroje a od tělesa se odráží, podle zákona dopadu a odrazu. Pokud je těleso osvětleno pouze odlesky, jsou vidět jen lesklé plochy tělesa. V praxi se, stejně jako v realitě, používá všech tří složek najednou. V OpenGL lze měnit u každé složky intenzita jednotlivých barev RGB modelu, čímž lze dosáhnout zajímavých grafických efektů. Pro použití světel v OpenGL je potřeba zapnout výpočet osvětlení funkcí glenable(gl LIGHTING). Pro zakázání výpočtu osvětlení potom slouží funkce gldisable(gl LIGHTING). Dále je nutné specifikovat pro které světlo se výpočet provádí. V OpenGL je k dispozici celkem osm světel označených LIGHT0...LIGHT7, ale některé implementace jich podporují i více. Použití více světel ovšem zabírá více systémových zdrojů a může způsobovat pomalejší vykreslování. Světla lze zapínat funkcí glenable(gl LIGHT?), kde za znak otazník je číslo 0-7, značící světelný zdroj. U každého světla lze nastavit parametry funkcí gllight*(). Za znak hvězdičky je potom označení typu předávaných parametrů tj. i, iv, f, fv. Kromě nastavení světelného zdroje popř. světelných zdrojů, je důležité nastavit optické vlastnosti materiálů těles ve scéně. K tomu slouží funkce 24

glmaterial*(), kde za znak hvězdičky se opět doplní typ předávaných parametrů i, iv, f, fv. Nastavení materiálu je možné zvlášt pro přední (Front) i pro zadní (Back) stranu povrchu tělesa. Aby osvětlení korektně fungovalo, je nezbytné u každé plošky povrchu vykreslovaného tělesa zadat normálový vektor. Tento vektor je totiž zapotřebí k výpočtům osvětlení a na jeho směru závisí, jak se bude od konkrétní části povrchu tělesa světlo odrážet. K zadání normálových vektorů slouží funkce glnormal3*(), která přijímá vždy 3 parametry a za znak hvězdičky je možné použít tyto zkratky typů b, s, i, f, d, bv, sv, iv, fv, dv. Zadaný normálový vektor by měl být v jednotkovém tvaru neboli normalizován, tj. délka vektoru je jedna. Normalizaci těchto vektorů je v OpenGL možné povolit funkcí glenable(gl NORMALIZE), s tím ovšem souvisí opět další výpočetní nároky, které mohou snížit celkový výkon vykreslování. Doporučuje se proto normalizaci provést programově před vykreslením, nebo je možné je mít předem uložené např. v poli. V souvislosti s osvětlením je potřeba zmínit typ stínování. V OpenGL jsou podporovány dva typy a to ploché a Goraudovo. Ploché stínování se někdy označuje jako konstantní. Principem plochého stínování je výpočet barvy pro celý povrch plošky, která je částí povrchu tělesa. To znamená, že celá tato ploška je obarvena vypočtenou barvou. U Goraudova stínování se provede výpočet barvy pro každý vrchol této vykreslované plošky, a ta je potom obarvena přechodem mezi těmito barvami. Ploché stínování je sice rychlejší, nicméně na vykresleném povrchu jsou viditelné hrany jednotlivých plošek. Goraudovo stínování tyto hrany minimalizuje. Ploché stínování se zapíná funkcí glshademodel(gl FLAT) a Goraudovo glshademodel(gl SMOOTH). Každý světelný zdroj má svoje vlastnosti. Například žárovka v místnosti má jiné vlastnosti, než denní světlo přicházející od slunce, nebo světlo ze svítilny. Můžeme proto typ světla rozdělit do tří kategorií: Bodové světlo - je například výše zmíněná žárovka. Zdroj tohoto světla je umístěn v prostoru v jednom bodě. Světlo se z něj šíří stejnou intenzitou všemi směry. V OpenGL pro zadání pozice světla slouží funkce gllightfv(light?, GL POSITION, pozice). V poli pozice je potom uložena poloha světla ve formě homogenních souřadnic. To znamená, že pro určení bodu v prostoru je zapotřebí 4 souřadnice (x, y, z, 1), kde právě ta čtvrtá souřadnice s hodnotou 1 značí, že se jedná o bod. Směrové světlo - je světlo přicházející z jednoho směru. Například okno v místnosti, nebo sluneční světlo. Sluneční světlo je možné považovat i za bodové, ale protože přichází z poměrně velké vzdálenosti, je možné ho považovat i za směrové. Chceme-li v OpenGL použít směrové světlo, stačí, když pro zadání pozice světla použijeme místo bodu vektor. Opět použijeme funkci gllightfv(), ovšem do pole pozice umístíme jako čtvrtou souřadnici nulu, tedy (x, y, z, 0). U homogenních souřadnic právě čtvrtá souřadnice 25

nastavená na nulu určuje, že se jedná o vektor. Ve směru vektoru se potom šíří světelné paprsky, které jsou rovnoběžné. Reflektorové světlo - je téměř shodné jako bodové světlo, rozdíl je ovšem v tom, že reflektorové světlo se šíří ve tvaru kužele. V OpenGL se jedná o nejsložitější typ světla. Pozice světelného zdroje se zadává stejně jako u bodového světla. Dále ovšem musíme specifikovat vektor směru světelného kužele. To lze nastavit vlastností GL SPOT DIRECTION pomocí funkce gllightfv(light?, GL SPOT DIRECTION, směr). V poli směr je potom směrový vektor, který je zavoláním funkce gllight() normalizován. Další vlastností je šíře kužele světelného paprsku. Vlastností GL SPOT CUTOFF výše zmiňované funkce gllight() lze nastavit úhel, který svírá okraj kužele a vektor směru. Hodnota tohoto úhlu je defaultně nastavena na 180 stupňů, takže se jedná o všesměrové světlo. Zadání úhlu je ovšem možné pouze v rozmezí 0-90 stupňů. Hodnota 180 je speciální. Hodnota 0 znamená, že se jedná o velice úzký paprsek, hodnota 90 potom značí reflektor, který svítí do celé šíře prostoru. 3.7. Texturování Název této kapitoly označuje techniku, jak obarvit stěny těles různými vzory, nebo obrazci. Tyto obrazce se nazývají textury, odtud tedy texturování. Nanášení textur na povrch těles nijak neovlivňuje jejich geometrické vlastnosti. Nejběžnější používané textury jsou dvojrozměrné, ale je možné použít i jednorozměrné a u některých grafických systémů i trojrozměrné. Dvojrozměrnou texturou se rozumí klasický obrázek ve formátu bmp, png apod. Jednorozměrná textura je v podstatě dvojrozměrná textura s výškou 1 - tedy jakýsi pruh pixelů. Trojrozměrná textura se někdy též nazývá objemová a nese v sobě i informace o struktuře materiálu, ze kterého je těleso vykresleno. Tyto objemové textury se spíše používají ve specializovaných systémech, například v medicíně a pod. Při texturování je potřeba dodržet následující postup: - vytvořit, nebo ze souboru načíst texturu, - vytvořit texturovací objekt, - povolit nanášení textur, - vykreslit tělesa se zadanými texturovacími koordináty. Textury je možné vytvářet nějakou procedurou přímo v aplikaci - těmto se říká procedurální textury, nebo načíst z nějakého grafického souboru. Tuto část musí provést programátor sám, OpenGL nenabízí žádnou funkcionalitu pro načítání textur ze souboru, nebo jejich vytváření. V každém vývojovém prostředí jsou techniky jak toho lze dosáhnout. Pro potřeby texturování by obrázky měly být 26

čtvercové a velikost strany by měla být mocninou 2. Tedy například 8x8, 16x16, 32x32, 64x64, 128x128 pixelů apod. Pokud máme nějakým způsobem k dispozici rastrová data textury, můžeme přistoupit k vytvoření texturovacího objektu. K tomu v OpenGL slouží funkce glteximage2d(target, level, components, width, height, border, format, type, *pixels), pro jednorozměrnou texturu by to byla funkce glteximage1d, které přijímají celkem devět parametrů: - target - pro jednorozměrnou texturu se nastaví GL TEXTURE 1D, pro dvojrozměrnou GL TEXTURE 2D. - level - slouží při mipmappingu, pro běžné textury se nastaví 0. - components - určuje počet barevných složek jednoho pixelu. Možné hodnoty jsou 1 - R, 2 - RA, 3 - RGB a 4 - RGBA, kde R-red, G-green, B-blue, A-alpha. - width - značí šířku textury v pixelech. - height - značí výšku textury v pixelech. - border - označuje šířku okraje textury, běžně se nastavuje na hodnotu 0. - format - udává formát dat použitý pro textury, nastavuje se např. GL RGB, GL RGBA, GL RED, apod. - type - udává typ dat použitých pro popis barevných složek pixelů, např. GL BYTE, GL UNSIGNED BYTE, apod. - *pixels - ukazatel na rastrová data textury, většinou ukazatel na pole. Po zadání tohoto příkazu jsou data textury odeslána do texturovací paměti. Povolení nanášení textur na povrch těles umožňuje funkce glenable(gl TEXTURE 2D), popř. 1D, nebo 3D. Pokud by nanášení textur nebylo povoleno, pro určení barev objektů, by bylo použito barev osvětlení, popř. barvy jednotlivých vrcholů (vertexů). Texturovací koordináty je zapotřebí zadat k zadání každého vrcholu vykreslovaného tělesa. K souřadnicím vrcholu se pomocí funkce gltexcoord*() zadávají souřadnice do textury. Namísto hvězdičky se doplní počet souřadnic a jejich datový typ tj. např. gltexcoord1f(), gltexcoord2f(), gltexcoord2dv, apod. Každá souřadnice textury má velikost v rozsahu od 0.0 do 1.0. Běžná dvojrozměrná textura je tedy čtverec o straně délky 1.0. Je ovšem možné zadávat souřadnice textur i větší než 1.0, pokud je zapnuto opakování motivu, můžeme zadat např. gltexcoord2f(4.0, 0.5). Textura se potom bude na povrchu 4x opakovat na ose x a na ose y bude použita pouze polovina textury. Pro nastavení různých parametrů textur, jako například 27

výše zmíněné opakování motivu, můžeme použít funkci gltexparametr*(target, pname, value). Za hvězdičku je opět možno dosadit f, i, fv, iv, podle použitých parametrů. - target - podle dimenze textury bud GL TEXTURE 1D, GL TEXTURE 2D, GL TEXTURE 3D. - pname - parametr GL TEXTURE WRAP? - za otazník se dosadí směr bud s, t,, popř. r a hodnota ( value ) GL REPEAT, pro opakování motivu, nebo GL CLAMP pro protažení posledního řádku/sloupce pixelů textury. Dalším parametrem může být GL MAG FILTER, který nastavuje filtr použitý při zvětšování textury, nebo GL MIN FILTER, použitý při zmenšování textury. Hodnotou ( value ) těchto parametrů potom může být bud G L NEAREST, nebo GL LINEAR. První filtr je rychlý, ale textura je potom jakoby kostičkovaná, druhý je složitější, ale textura vypadá lépe. V závěru této kapitoly bych se ještě zmínil o tzv. mipmappingu. Je to technika, která se snaží minimalizovat vizuální chyby při texturování. Podstatou je to, že se textura uloží ve více rozlišeních. Při vykreslování se potom z těchto textur vybere ta, která má optimální rozlišení vůči relativní velikosti povrchu. 28

Pro detailní popis systému OpenGL doporučuji knihu OpenGL(R) programming guide [2]. Výborným zdrojem o OpenGL pro začínající vývojáře je seriál Grafická knihovna OpenGL od pana Tišnovského [5]. 29

Závěr Při vývoji této práce jsem zjistil, že jakkoliv je knihovna OpenGL rozšířená, je jen velmi malá podpora pro prostředí LispWorks. Největší podpory se těší vývojáři v jazyce C++. Nicméně i přes všechny obtíže jsem se dostal až sem, k závěru mojí práce. Věřím, že v ní bude hledat inspiraci řada studentů, nejen středoškolských, ale i vysokoškolských. Program DemonstraceOpenGL jednoduše a přehledně předvádí možnosti 3D počítačové grafiky. Součástí je i šest demonstračních souborů, které mohou pomoci v začátcích práce s programem. Doufám, že program budou využívat nejen učitelé a jejich studenti, ale i další začínající vývojáři. Jsem přesvědčen, že se mi podařilo naplnit cíle této bakalářské práce. Námětem pro další práci by byla možnost načítání obrázků textur přímo z grafických souborů a převod rastrových dat do formátu gl-vector. 30

Reference [1] Graham, Paul. ANSI Common Lisp Prentice Hall, 1996. [2] Shreiner, Dave. Mason, Woo. Neider, Jackie. Davis, Tom. OpenGL(R) programming guide:the official guide to learning OpenGL Addison-Wesley, 2003. [3] Sieble, Peter. Practical Common Lisp. - internetový zdroj www.gigamonkeys.com/book/. [4] LispWorks User Guide and Reference Manual. - internetový zdroj www.lispworks.com/documentation/. [5] Tišnovský, Pavel. Seriál - Grafická knihovna OpenGL. - internetový zdroj http://www.root.cz/clanky/graficka-knihovna-opengl-1/. 31

A. Tvary, konstanty a příkazy Tvar konstanta OpenGL ekvivalent Lispu BODY GL POINTS *GL-POINTS* ČÁRY GL LINES *GL-LINES* TROJÚHELNÍKY GL TRIANGLES *GL-TRIANGLES* OBDÉLNÍKY GL QUADS *GL-QUADS* LOMENÉ-ČÁRY GL LINE STRIP *GL-LINE-STRIP* UZAVŘENÉ-ČÁRY GL LINE LOOP *GL-LINE-LOOP* TRS-TROÚHELNÍKŮ PÁS-TROJÚHELNÍKŮ PÁS-OBDÉLNÍKŮ GL TRIANGLE FAN *GL-TRIANGLE-FAN* GL TRIANGLE STRIP *GL-TRIANGLE-STRIP* GL QUAD STRIP *GL-QUAD-STRIP* POLYGON GL POLYGON *GL-POLYGON* Tabulka 3. Tvary příkazu ZAČÍT-TVAR 32

Příkaz Parametry Popis ZAČÍT-TVAR tvar viz. tabulka Tvary ZADAT-VRCHOL x y z tři čísla stejného datového typu ZADAT-BARVU barva viz. tabulka Barvy ZADAT-BARVU x y z tři celá čísla v rozmezí hodnot 0-255 ZADAT-NORMÁLU x y z tři čísla stejného datového typu ZADAT-KOTVU-TEXTURY s t dvě čísla stejného datového typu POSUNUTÍ x y z tři čísla ROTACE uhel x y z čtyři čísla ZMĚNA-MĚŘÍTKA x y z tři čísla Tabulka 4. Seznam příkazů 33

Barva R G B ČERNÁ 0 0 0 BÍLÁ 255 255 255 ČERVENÁ 255 0 0 SVĚTLE-ČERVENÁ 253 65 10 TMAVĚ-ČERVENÁ 139 0 0 MODRÁ 0 0 255 SVĚTLE-MODRÁ 135 206 250 TMAVĚ-MODRÁ 0 0 128 ZELENÁ 0 255 0 SVĚTLE-ZELENÁ 144 238 144 TMAVĚ-ZELENÁ 0 100 0 RŮŽOVÁ 255 192 203 FIALOVÁ 199 21 133 ORANŽOVÁ 255 165 0 ŽLUTÁ 255 255 0 MAGENTA 255 0 255 HNĚDÁ 165 42 42 OKROVÁ 218 165 32 ŠEDÁ 128 128 128 Tabulka 5. Barvy 34

B. Obsah přiloženého CD V samotném závěru práce je uveden stručný popis obsahu přiloženého CD/DVD, tj. závazné adresářové struktury, důležitých souborů apod. doc/ src/ Dokumentace práce ve formátu PDF, vytvořená dle závazného stylu KI PřF pro diplomové práce, včetně všech příloh, a všechny soubory nutné pro bezproblémové vygenerování PDF souboru dokumentace (v ZIP archivu), tj. zdrojový text dokumentace, vložené obrázky, apod. Kompletní zdrojové texty programu demonstraceopengl se všemi potřebnými (převzatými) zdrojovými texty, knihovnami a dalšími soubory pro bezproblémové vytvoření spustitelných verzí programu. readme.txt Instrukce pro instalaci a spuštění programu demonstraceopengl, včetně požadavků pro jeho provoz. Navíc CD/DVD obsahuje: data/ Ukázková a testovací data použitá v práci. U veškerých odjinud převzatých materiálů obsažených na CD/DVD jejich zahrnutí dovolují podmínky pro jejich šíření nebo přiložený souhlas držitele copyrightu. Pro materiály, u kterých toto není splněno, je uveden jejich zdroj (webová adresa) v textu dokumentace práce nebo v souboru readme.txt. 35