Grafické API

Z CHWiki

Přejít na: navigace, hledání

Grafické API je rozhraní, přes které váš program komunikuje s grafickou kartou, případně s jejími ovladači. Navíc nezáleží na tom, jaká je v počítači konkrétní grafická karta, grafické API rozdíly mezi nimi skryje (samozřejmě musíte stále řešit situace, kdy karta nějakou funkci nepodporuje).

Dvě nejpoužívanější API jsou OpenGL a Direct3D.

Obsah

[editovat] OpenGL

OpenGL bylo původně vyvinuto firmou SGI. V současné době se o jeho vývoj stará OpenGL ARB. Aktuální verze je 2.1, ARB pracuje na verzi 3.0, které by měla rozhraní pročistit, aby lépe odpovídalo aktuálnímu stavu. I tak je ale OpenGL 2.1 plnohodnoté grafické API.

Základní vlastnosti:

  • K dispozici pro mnoho platforem (vč. samozřejmě Windows a Linuxu)
  • Standardní rozhraní je v C, wrappery jsou k dispozici i pro další jazyky.
  • Vyvíjené otevřenou skupinou společností

[editovat] Direct3D

Direct3D je součástí širšího API jménem DirectX. Je vyvíjen společností Microsoft jako knihovna pro programování multimediálních aplikací pro Windows. Nejnovější verze, Direct3D 10, je k dispozici pouze pro Windows Vista.

Základní vlastnosti:

  • Pouze pro Windows.
  • Rozhraní je objektově orientované, napsané v COM. Je možné ho přímo použít i v jazyce C. Pro další jazyky jsou opět k dispozici wrappery.
  • Vyvíjeno Microsoftem.

[editovat] Časté dotazy

[editovat] Které rozhraní si mám vybrat?

Rozdíly mezi nimi nejsou příliš velké, doporučit lze obě. Pokud chcete, aby vaše hra běžela i pod Linuxem, pak připadá v úvahu jen OpenGL.

[editovat] Jak to použiju ve svém jazyce?

Seznam použitelných knihoven je na stránce Přehled herních knihoven.


[editovat] Eosie 29.8.2009 k aktuálnímu stavu API

Rád bych poučil uživatele Mattiass i mattcpplus. Direct3D je dobré API, v tom mají oba lidé pravdu. Smile Ale těch 3D API je dnes víc než prstů na jedné ruce a všechny se používají.

Také bych rád bych nějaké věci uvedl na pravou míru a přinesl do diskuze nějaké zajímavé informace, i když je mi jasné, že tohle vlákno si to nezaslouží. Padly tu nějaký blbosti a z příspěvků nepoznám, které drogy jejich autoři berou.


Nějaká fakta: - OpenGL a Direct3D jsou stejně výkoné. Nezáleží, jestli použijete DrawIndexedPrimitives nebo glDrawElements, obě funkce se mapují na jednu společnou funkci v driveru. Driver má uvnitř společný interface pro všechna 3D API (tzn. má uvnitř svoje vlastní 3D API) a D3D nebo OGL implementace v driveru je opravdu jen tenká vrstva nad tím, tedy z podstaty věci nemůže být jedno API rychlejší než druhé. Ve WinXP mělo OpenGL dokonce menší režii, protože D3D se častěji přepínalo do kernel modu a to je opravdu časově náročná záležitost. - Rychlost OpenGL a Direct3D je nepodstatná, protože ty API téměř nic nedělají, pouze přeposílají data do hlavní části driveru, která generuje command stream pro GPU. Účel obou API je tedy jen a pouze generování příkazů pro GPU, samotný rendering neprovádí. - Dobrej příklad, jak vypadá architektura driverů, je projekt Mesa-Gallium3D. - Do vývoje OpenGL investuje hromada společností. Nejvíc ze všech NVIDIA a AMD. Mimojiné ale taky Blizzard se podílel na třech posledních verzí OpenGL (3.0 až 3.2) a aktivně spolupracuje s komunitou. Pokud se vám na OpenGL cokoliv nelíbí a máte nápad, jak to změnit, kontaktujte člověka jménem Rob Barris (z Blizzardu). Už se mu do OpenGL standardu podařilo integrovat spoustu funkcí (vylepšená práce s buffery je jeho práce) a bude to dělat i nadále. Nebo napište do jeho vlákna na OpenGL.org fórech "Talk about your applications" (tam to mimojiné čte např. i Barthold z NVIDIA a další, co stojí za OpenGL). - Co se týče standardizace, Blizzard dělá pro OpenGL a jeho komunitu snad víc než id software. Vede ale NVIDIA, která sama považuje OpenGL jako za hlavní API (věděl bych o pár vlivných zaměstancích NVIDIA, kteří Direct3D neviděli a nechcou vidět). - Všechny hry od id software i Blizzardu umí běhat pod OpenGL. Do toho počítám World of Warcraft i nadcházející StarCraft 2 a Diablo 3. Pod OpenGL běhaly i dřívější hry, např. Half-Life a Unreal Tournament. Těch her bude samozřejmě mnohem víc, ale celkově je použité API docela nepodstatná informace (viz dále). - Kombinace OpenGL+OpenCL jako jediná podporuje funkce z Direct3D 11 na Windows XP a starších systémech. Jediný způsob, jak na Windows XP využít nejnovější grafické technologie, je pouze s OpenGL.

Nejdřív Direct3D vs OpenGL názor: Podle mě jsou obě API mrtvé. Dnes vládnou konzole. Nové verze Direct3D jsou téměř nepoužívané a kromě některých známých herních studií o ně nemá nikdo zájem. OpenGL kraluje na MacOSX, iPhone a na Windows se používá proto, aby si ušetřili práci, protože na Macu stejně bude potřeba.

Osobně jsem spíš pro OpenGL, ale shadery raději píšu v DX HLSL. Každý zkušenější vývojář si umí navrhnout vlastní 3D API pro jeho účely a pokud chce podporovat konzole, tak i musí. Toto vlastní 3D API pak může komunikovat s Direct3D, OpenGL, Xbox XDK (v podstatě Direct3D), libgcm (na PS3), PSGL (taky PS3, v podstatě OpenGL), OpenGL ES (na iPhone a jiné mobily), GX (na Wii, podobné OpenGL), ale na použitém API už nezáleží a nikdy ani moc nezáleželo. Je to jen "inženýrský" detail.

Dále jsem se rozhodl reagovat jen na první příspěvek, protože je v něm docela dost nesmyslů.

mattcpplus napsal:

Kazdy pise - uc sa OpenGL na zaciatok lebo je lahsi a kod napisany v OGL je 1/3 kodu v Direct3D.

To jsi asi špatně četl ty tvoje stovky stránek. Tohle byla pravda v době Direct3D 5/6/7 a tento názor v té době vyslovil J.Carmack. A zajímalo by mě, kdo říká, že má každý začínat v OpenGL? OpenGL rozhodně není lehčí. Obtížnost obou 3D API spočívá v teorii grafiky a rasterizace - kdo ji má zmáknutou, dokáže s oběma API udělat to samé.

mattcpplus napsal: Blbost..OGL je pri programovani hier podla mna uplne zbytocny.

Otevři si libovolný eshop s hrama pro MacOSX, všechny používají OpenGL. A jedná se o nemalé množství dnešních her, co jsou normálně dostupné na Windows a na konzole.

mattcpplus napsal: Vsetko co potrebujete je v DirectX - Direct3D, DirectInput, DirectDraw...

DirectInput není moc dobré API, ignoruje hodně nastavení z ovládacích panelů. Hodně lidí k HID přistupuje buď přes WinAPI nebo nově k XInput, který líp podporuje Xbox controller. DirectDraw už se roky vůbec nepoužívá a nikdy nemělo hardwarovou akceleraci.

mattcpplus napsal: Proti: Napriklad Quake 4 a Domm 3 hry su cisto OpenGL hry(obe hry su z tej slabsej kategorie aj ked ich kazdy ospevuje su to len nudne strielacky).

DirectX Enginy: takmer vsetky, pocinajuc tym najdokonalejsim, ktorym je podla mna Source engine od Valve(HL2), cez Unreal Engine 3(Gears of War) az po CryEngine(Crysis). DirectX hry: Half-Life 2, HL2 Ep1, HL2 Ep2(podla mna najlepsie hry na svete), GoW, Unreal Tournament, vsetky zavodne hry, Mafia, GTA, Splinter Cell, Batman: Arkham Asylum, Halo, vsetky RTS(strategie), a aj vsetky sportove hry od EA a stovky dalsich.

Z tohoto to vypadá, že nejsi vývojář, ale spíš jen hráč her. Pokud tady chceš recenzovat hry, vybral sis špatné fórum. Source engine je už celkem zastaralý, proto Valve pracuje na novém. CryEngine je špatně optimalizovaný. Doom3 a Quake4 byly nudné je kvůli špatnému game designu. Unreal Tournament uměl běhat na OpenGL, Direct3D, Glide i přes software rasterizer. Jak jsem už naznačil, lepší hry používají více 3D API, aby podporovaly více platforem. např. Call of Duty 4 jich používá minimálně 5 (OpenGL, Direct3D, Xbox XDK, libgcm, GX).

Osobně pochybuju, že jeden z těch dvou lidí jmenovaných na začátku příspěvku někdy něco většího programoval, protože jejich prezentované zkušenosti bych odhadoval na začátečníka.