OpenGL
OpenGL (Open Graphics Library) je průmyslový standard specifikující multiplatformní rozhraní (API) pro tvorbu aplikací počítačové grafiky. Používá se při tvorbě počítačových her, CAD programů, aplikací virtuální reality či vědeckotechnické vizualizace apod.
Vývojář | Khronos Group |
---|---|
První vydání | 30. června 1992 |
Aktuální verze | 4.6 (31. července 2017[1]) |
Operační systém | multiplatformní |
Vyvíjeno v | C a OpenGL Shading Language |
Typ softwaru | API, framework |
Web | https://www.khronos.org/opengl/ |
Některá data mohou pocházet z datové položky. |
Standard OpenGL spravuje konsorcium označované jako ARB (Architecture Review Board), jehož členy jsou firmy jako např. NVIDIA, SGI, Microsoft, AMD atd.
Nástupcem OpenGL má být Vulkan.
Implementace
editovatSpecifikace OpenGL popisuje abstraktní API pro vykreslování 2D a 3D grafiky. Implementace OpenGL existují pro prakticky všechny počítačové platformy, na kterých je možno vykreslovat grafiku. Kromě implementací vestavěných v grafickém hardware (na grafické kartě) existují také softwarové implementace, které umožňují používat OpenGL i na hardwaru, který ho sám o sobě nepodporuje (ale obvykle nabízejí nižší výkon). Příkladem takové implementace je open source knihovna Mesa 3D, která ovšem z licenčních důvodů nemůže být označena jako implementace OpenGL, ale pouze jako implementace API, které je „velmi blízké“ OpenGL.
Struktura OpenGL
editovatZákladní funkcí OpenGL je vykreslování do framebufferu. Umožňuje vykreslování různých základních primitiv (bodů, úseček, mnohoúhelníků a obdélníků pixelů) v několika různých režimech. Veškerá činnost OpenGL se řídí vydáváním příkazů pomocí volání funkcí a procedur (kterých OpenGL definuje cca 250). V OpenGL se nepoužívá objektově orientované programování. Jednotlivá primitiva jsou definována pomocí vrcholů – každý z nich definuje bod, koncový bod hrany nebo vrchol mnohoúhelníku. Každý vrchol má přiřazena data (obsahující souřadnice umístění bodu, barvy, normály a texturovací souřadnice).
Rozhraní OpenGL je založeno na architektuře klient–server – program (klient) vydává příkazy, které grafický adaptér (server) vykonává. Díky této architektuře je možné, aby program fyzicky běžel na jiném počítači než na tom, na kterém se příkazy vykonávají, a příkazy se předávaly prostřednictvím počítačové sítě.
OpenGL je také multiplatformní software, což mu přináší nezávislost na použitém jazyce. Specifikace OpenGL neříká nic na téma získávání a řízení kontextu platformy, a nechává tak tuto problematiku na podkladovém okenním systému. Z toho důvodu je OpenGL čistě zaměřen na vykreslování, přičemž neposkytuje žádné API pro vstup, audio a vytváření oken.
Vývoj
editovatOpenGL je vyvíjející se API. Nové verze OpenGL jsou pravidelně vydávány skupinou Khronos Group. Každá taková verze rozšiřuje API o podporu pro mnoho dalších vlastností a funkcí. Detaily přínosu (nových vlastností) každé verze jsou rozhodnuty mezi členy skupiny Khronos Group, kterými jsou výrobci grafických karet, návrháři operačních systémů, známé technologické společnosti jako například Mozilla či Google.
Kromě vlastností požadovaných samotnou jádrovou API, mohou členové Khronos Group poskytovat další rozšiřující funkcionality, zavádět nové funkce, konstanty, a také uvolnit nebo odstranit omezení stávajících funkcí OpenGL. Všechna uvedená rozšíření jsou shromažďována a definována v registru OpenGL Registry.
Každé rozšíření je opatřeno krátkým identifikátorem založeným na jménu společnosti, která ho vytvořila. Kupříkladu identifikátor Nvidia je NV, což může být součástí celého jména rozšíření GL_NV_half_float
, konstanty GL_HALF_FLOAT_NV
a funkce glVertex2hNV()
. Pokud se více členů dohodne implementovat stejnou funkcionalitu využívající stejnou API, může být zavedeno sdílené rozšíření využívající identifikátor EXT. V těchto případech se může také stát, že konsorcium Architecture Review Board skupiny Khronos Group vydá k rozšíření svůj výslovný souhlas, a identifikátor nese značku ARB.
Dokumentace
editovatOpenGL API se těší vysoké popularitě také díky své kvalitně zpracované oficiální dokumentaci. Konsorcium ARB vydalo sérii příruček společně s aktualizovanými specifikacemi, které sledují změny v API. Tyto příručky jsou obecně známé barvami svých vazeb:
Červená kniha (The Red Book)
editovatOpenGL programovací průvodce, 8. vydání. ISBN 0-321-77303-9
Tutoriál a příručka.
Oranžová kniha (The Orange Book)
editovatOpenGL Shader jazyk, 3. vydání. ISBN 0-321-63763-1
Tutoriál a příručka pro GLSL.
Historické knihy (před-OpenGL 2.0):
Zelená kniha (The Green Book)
editovatOpenGL Programování pro X Window System. ISBN 978-0-201-48359-8
Kniha o X11 programové konstrukci a OpenGL Utility Toolkit (GLUT).
Modrá kniha (The Blue Book)
editovatReferenční příručka OpenGL, 4. vydání. ISBN 0-321-17383-X
V podstatě hard-copy výtisk stránek Unix manuálu (man) pro OpenGL.
Zahrnuje rozkládací diagram velikosti plakátu ukazující strukturu implementace idealizované OpenGL.
Alpha kniha nebo také Bílá obálka (The Alpha Book)
editovatOpenGL programování pro Windows 95 a Windows NT. ISBN 0-201-40709-4
Kniha o propojení OpenGL s Microsoft Windows.
Programování v OpenGL
editovatProgramovací jazyky jako je například Delphi nebo C++ mají vytvořené speciální knihovny, které umožňují jednoduchý přístup k API funkcím OpenGL. Některé jsou dostupné ihned po instalaci vývojového prostředí a některé jsou dostupné na internetu.
Základní příkazy
editovatNásledující příkazy jsou napsané v programovacím jazyku Delphi, nicméně syntaxe ostatních jazyků pro uvedené příklady je dost podobná.
1. příklad
editovatNaznačuje jak vyprázdnit obsah grafických zásobníků.
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Vymazání zásobníku zobrazení a hloubkového zásobníku
2. příklad
editovatPříkaz umožní nahlédnout na trojrozměrný prostor pomocí projekce.
glMatrixMode( GL_PROJECTION ); // Definuje způsob nahlédnutí na vykreslované objekty.
3. příklad
editovatPoužívá se před umístěním nových objektů do trojrozměrného prostoru.
glLoadIdentity(); // Restartne pozici v grafické matici. glTranslatef(0.0, -1.0, -5.0); // Příkaz nastaví pozici pro vykreslení v prostoru, která je uváděná v pořadí pro osy X, Y, Z.
4. příklad
editovatFunkce, která umožňuje rotaci objektu. Objekt může rotovat v libovolném směru pod libovolných úhlem.
glRotatef(12 ,0,-1,0); // První hodnota uvádí aktuální úhel zobrazení, dál jsou pak hodnoty pro otáčení na vybraných osách.
Historie
editovatV 80. letech 20. století bylo opravdovou výzvou vyvíjet software, který by mohl pracovat s různým grafickým hardwarem. Softwaroví vývojáři psali různá rozhraní a ovladače pro každý kus hardwaru. Tato práce byla velice drahá a bylo vyžadováno veliké úsilí.
Na počátku 90. let byla jedničkou v 3D grafice firma SGI. Jejich technologie IRIS GL API byla považována za nejmodernější a de facto se stala průmyslovým standardem zastiňující technologii PHIGS. IRIS GL se stala nejpoužívanější díky své jednoduchosti pro použití a podpory okamžitého renderování. Naproti tomu metoda PHIGS byla považován za obtížnou k použití a zastaralou ve smyslu funkčnosti.
Konkurenti SGI (včetně Sun Microsystems, Hewlett Packard a IBM) také chtěli na trh přinést 3D hardware, podporovaný rozšířením vytvořeným pro standard PHIGS. Čím více dodavatelů 3D hardwaru bylo, tím menší měla SGI podílu trhu. Ve snaze ovlivnit trh, SGI se rozhodla změnit jejich IrisGL API na volně otevřený standard nazvaný OpenGL.
Nicméně SGI měla velký počet zákazníků softwaru, pro které změna z IrisGL na OpenGL představovala větší investici. Navíc rozhraní IrisGL mělo funkce, které nebyly důležité pro 3D grafiku. Například obsahovalo zvlášť funkce pro okna, rozhraní pro myš a klávesnici, protože bylo vyvíjeno před X Window System a Sun NeWS systémy. Také knihovny IrisGL byly kvůli licencovaným a patentovaným částem nevhodné pro volný přístup. Tyto důvody donutily SGI nadále podporovat moderní Iris Inventor v programování rozhraní když obchod pro OpenGL kvetl.
Jedno z omezení IrisGL bylo to, že poskytoval přístup pouze k funkcím podporovaným základním hardwarem. Pokud grafický hardware nepodporoval některé funkce, aplikace nebyla schopna je použít. OpenGL tento problém obcházel poskytováním podpory pomocí softwaru pro vlastnosti nepodporované hardwarem tím, že dovoloval aplikacím používat pokročilou grafiku na relativně nízkovýkonových systémech. OpenGL standardizoval přístup k hardwaru tak, že tlačil odpovědnost za vývoj na výrobce hardwaru a přenesené funkce na základní operační systém. S tolika různými druhy grafického hardware, pokud by všechny uměly komunikovat stejným jazykem, by to mělo významný vliv na to, že by vývojáři mohli vyvíjet 3D software na vyšších úrovních.
V roce 1992, SGI byla vedena k vytvoření OpenGL průmyslového konsorcia (OpenGL ARB), skupina společností, které udržují a rozšiřují specifikaci OpenGL v budoucnu.
V roce 1994 si SGI hrála s myšlenkou realizovat OpenGL++, které by vkládalo možnosti jako např. rozhraní grafů. Myšlenka nikdy nebyla realizována.
V roce 1995 Microsoft zveřejnil Direct3D, který byl schopen konkurovat OpenGL. Dne 17. prosince 1997 Microsoft a SGI zahájili Fahrenheitův projekt, který měl spojit to nejlepší z OpenGL a Direct3D (přidávaje rozhraní pro grafy). V roce 1998 se k projektu připojil Hewlett Packard. To z počátku ukázalo nějaký příslib přinesení řádu do světa interaktivní 3D počítačové grafiky, ale z důvodu finančních omezení v SGI, strategických důvodů u Microsoftu a obecného nedostatku podpory průmyslu byl opuštěn v roce 1999.
V červenci roku 2006 OpenGL ARB hlasovala pro přenesení kontroly nad OpenGL standardem pod Khronos Group.
Související články
editovatReference
editovatExterní odkazy
editovat- Obrázky, zvuky či videa k tématu OpenGL na Wikimedia Commons
- www.opengl.org Archivováno 26. 2. 2011 na Wayback Machine. – Oficiální stránky OpenGL, obsahují i specifikaci standardu (anglicky)
- nehe.gamedev.net – Tutoriály programování OpenGL od NeHe (anglicky)
- nehe.ceske-hry.cz – Český překlad tutoriálů od NeHe
- Seriál o grafické knihovně OpenGL na Root.cz
- Další články a seriály o OpenGL na Root.cz
- Valve otevřelo zdrojáky debuggeru pro OpenGL na Root.cz
- AMD Firepro W9100 připravena na OpenCL 2.0 na www.acceleware.com (anglicky)