Hlavní navigace

OpenGL a Direct3D (3)

18. 8. 2004
Doba čtení: 13 minut

Sdílet

Tento neplánovaný díl je především reakcí na diskuse k dílům minulým. Nebudu se moc věnovat věcem, jako je číslování verzí DirectX nebo omyl s DirectPlay, protože je v současné chvíli nepovažuji za podstatné. Berte ho spíše jako úvahu na téma: Jaké opravdu zásadní chyby jsem při psaní udělal... a že jich bylo dost :-(

Budou další pokračování?

Co se mi na root.cz opravdu líbí, je, že čtenáři píší do diskusí. Je jedno, jestli se jedná o pochvaly, které se mě ale zrovna netýkají :-(, upozornění na chyby v článku, nebo rovnou návrhy na ukončení seriálu, těch bylo povícero. Možná se vám poslední jmenované splní, zatím ještě váhám, záleží na tom, jaký budu mít pocit, až dopíši tento článek a přečtu si následnou diskusi.

První ze všeho bych se chtěl oficiálně omluvit Johance, která na moji blbost doplatila pravděpodobně nejvíce, protože měla spoustu práce s přípravou vydání – nejen s prvními dvěma díly, ale i s dalšími, které jsem jí poslal také. Promiň.

Své práce s psaním tohoto seriálu nelituji. I když to tak nevypadá, naučil jsem se spoustu nových věcí, především, že nic není dokonalé – viz dále v průběhu článku. Lituji spíše toho, že jsem si během dvou týdnů kompletně zlikvidoval svou pověst, kterou jsem pracně budoval přes tři roky :-(

Úvaha na úvod

Začnu citací z diskuse k prvnímu dílu: Pamatuju se jak mi kamaradi, kteri me ucili programovat grafiku vzdycky rikali. Pokud neumis programovat v directX a openGL stejne nikdy nekritizuj ten ktery API :)

Jo, už to chápu taky, škoda, že až teď. Myslel jsem si, že čtyřsetstránková knížka o Direct3D by měla stačit, ale asi opravdu nebyla zrovna kvalitní. Číst o něčem a prakticky to používat je obrovský rozdíl. Zkrátka, nepřesvědčila mě, proč přejít na Direct3D, spíš o tom, proč na něj nepřejít, a v tomto duchu jsem začal psát i seriál. Uznávám, že záleží především na programátorovi, co umí a co si vybere… nicméně nějaké znalosti tam přeci jen byly. Asi jsem neměl zrovna psát, že budu „vařit z vody“.

Teď už chápu, že DirectX nebude až tak špatné, jak jsem si původně myslel. Dožral mě především autor zmiňovaného článku o UT 2004, a právě tím mě nasměroval ke „kydání na DX“. Věřte nebo ne, opravdu se mi něco takového moc často nestává.

Ale představte si tu situaci a opravte mě, jestli se mýlím (výzva především k autorovi čl. UT 2004). Úmyslně píši do uvozovek… „Přes dva roky překládám po večerech OpenGL Tutoriály (350 stran A4 !!!) a pak si přečtu článek nějakého pařana, který o DirectX a OpenGL ví jen to, že existujou, a bez nejzákladnějších znalostí dojde k závěru, že OpenGL je totální sh… zaručeně horší.“

Po závěrečném čtení: Když tak uvažuji nad tím, co jsem před chvílí napsal, stalo se mi úplně to samé :-(. Ale čestně, co byste udělali vy? Zkusili byste alespoň napsat do diskuse, nebo byste si jen pomysleli: „Je to magor, ale ať mu to řekne někdo jinej.“? Po pravdě, mně jste to řekli a děkuji vám za to.

Dále pokusím o rychlé srovnání OpenGL a DirectX (opět), které by teď už mělo být alespoň trochu vypovídající. Doufám, že nezačnu opět žádné bludy.

Proč ne Direct3D

Vezmu si jeden modelový objekt (sebe) a vše popíši na něm.

První a hlavní důvod je ten, že jsem se cca před rokem rozhodl řídit heslem nepokradeš, a opustil Windows. Příčinou bylo přečtení rozhovoru s Billem Gatesem, který zmínil něco ve smyslu, že pokud by všichni používali legální software, měl by Microsoft dostatek peněz na opravení snad všech chyb ve Windows. Řídil jsem se přesně jeho výzvou a zahodil všechna nelegální CD s programy. Někdy mi připadá jako paradox, že používáním GNU/Linuxu de facto poskytuji Microsoftu prostředky na vývoj Windows, ale přesně tak to je :-)

Pokud jste to z minulého odstavce nepochopili, DirectX nefunguje v Linuxu. Nefunguje dokonce ani v Mac OS a ani ve Free/Net/Open-BSD, BeOSu a všech dalších ne-Win* operačních systémech. Funguje jen a pouze pod MS Windows. Určitě chápete, že mi to jako uživateli Linuxu nemusí až tak úplně stačit. U OpenGL tento problém kompletně odpadá, funguje snad všude. Když není dostupné DirectX, je to prakticky jediná volba. Někdy tak uvažuji, jestli by se Microsoft vůbec vzpamatoval a nezkrachoval by, kdyby většina lidí přestala Windows používat. Všimli jste si taky těch v poslední době neustále přibývajících reklam v počítačových časopisech…?

Jako druhý důvod lze zmínit můj „osobní odpor“ ke všemu, co nese označení Microsoft. Nejsem si až tak jistý, jak u mě vznikl, prostě je. Častými pády programů této firmy jsem prostě ztratil důvěru ke všem novým verzím, které za několik let vývoje přidají nové grafické efekty a opraví staré chyby. Prosím, v diskusi na toto nereagujte.

Říká se, že Microsoft má monopol na spoustu věcí týkajících se IT, ale dokud si ho nedosadíte za šelmu do Janovy Apokalypsy nebo za Velkého bratra do románu 1984 od George Orwella, nemyslím, že budete mít mrazení v zádech a neurčité pocity obav… ale teď už opravdu odbíhám od hlavního tématu.

Třetím důvodem je, že mi OpenGL prostě vyhovuje a nemám potřebu se učit spoustu nových a naprosto odlišných věcí, o kterých si nejsem až tak jistý, jestli by mi byly vůbec k něčemu. Za dobu, co se věnuji 3D grafice, jsem potkal pouze jednoho člověka, který přešel z OpenGL na DirectX, druhým směrem jich ale šlo asi dvacet – no, deset určitě. Ale máte pravdu, nemůžu znát každého, zvlášť z DX strany plotu.

Ona osoba, kterou jsem zmínil v předchozím odstavci, uvedla jako hlavní a prakticky jediný důvod pro přechod tzv. lepší podporu. Nepochopil jsem, co to znamená, ale když jsem tohle slovo slyšel ve spojení s Microsoftem, napadlo mě něco jako gigantická reklama, používají to všichni, tak to musí být dobré, a v čem je to opravdu lepší? Na to poslední měl odpovědět tento seriál, ale moc se mu to nepovedlo :-(

Abych to shrnul, asi jste si všimli, že se jedná především o varování vnitřního hlasu. Někomu stačit nemusí, mně ano. Nemám žádný pádný důvod, proč bych neměl přejít, a pokud nebude, o programování v DirectX se pokoušet nebudu. Jediné, co by mě mohlo přemluvit, by byla možnost pracovat v nějaké programátorské společnosti, která preferuje výhradně DirectX, pak bych začal uvažovat, ale v současnosti zkrátka nemám důvod…

V čem je Direct3D lepší než OpenGL

Asi nejmarkantnější výhoda Direct3D oproti OpenGL je přítomnost ostatních DX knihoven pro zvuky, síťování atd., které dohromady vytvářejí jeden ucelený balík čili DirectX SDK (jmenuje se to tak?). Pokud kódujete počítačové hry, máte k dispozici na jednom místě snad všechno, co potřebujete, a nemusíte po Internetu složitě hledat, jak loadovat a vykreslit 3ds model (Umí Direct3D i tohle? Jestli ano, opravdu respekt :-), nahrát jpg obrázek, naprogramovat multiplayer, přehrát empétrojku a podobně. Podle mého názoru se ve (Windows) hrách rozšířilo právě a především z tohoto důvodu.

OpenGL je jen a pouze pro rendering, vše ostatní musíte vytvořit jinými nástroji, jako jsou SDL a jeho podknihovny (SDL_image, SDL_sound, SDL_net, SDL_mixer…) určené především pro tvorbu počítačových her, OpenAL nebo FMOD na zvuky, a další, které ovšem ne každý zná (slyšel o nich) a umí je používat.

Na druhou stranu, budeme-li na chvíli ignorovat hry a podíváme-li se na nástroje typu Blender, 3D Studio Max, Mayu, Solid Works a další, i v dnešních dobách OpenGL jasně vede – k čemu by v těchto programech byly zvuky nebo multiplayer? Poznámka pro šťouraly: Ano, Direct3D se v současnosti začíná dostávat i do této oblasti.

Argument, že DirectX používá v současnosti cca 99 procent všech nových her, je sice pravdivý, ale nic neříká o tom, jestli je D3D opravdu lepší než OpenGL. Tím bych se jako zastánce D3D určitě nevytahoval. Mohly by se napsat desítky/stovky analogických příkladů, ale většina z nich by nebyla naprosto jednoznačná – typicky Windows s Linuxem ap.

Z diskuse si půjčím příklad MS IE a Mozilly, který považuji za hodně názorný. Naprostá většina tzv. kancelářských uživatelů si myslí, že Internet = prohlížeč MS IE, a absolutně nedokáží pochopit, že se na web dá dostat i pomocí jiných programů – např. u mojí mámy to byly i po ukázce Opery tři hodiny zoufalého vysvětlování, počítač i net používá denně :-(. Nedávno mě při rozhovoru o prohlížečích s jedním učitelem, kterého si vážím a který o počítačích ví opravdu hodně, dostalo, že rozhovor o IE, Mozille a Opeře završil tím, že používá MyIE. Hlavní argument: Je založeno na MS IE, takže zobrazuje všechno stejně jako MS IE. Asi největší úlet, jaký jsem od něj kdy slyšel. Někdy mě baví vkládat do kaskádových stylů nekončící komentáře /nefunguje v IE/. Promiňte, opět odbíhám od tématu.

Objektová architektura může být výhodou a zároveň nevýhodou. Výhodou je, že se scéna může organizovat do hierarchických bloků (padlo to v diskusi, nevím, ale je to logické). Nevýhodou oproti strukturálnímu OpenGL může být složitější napojení na nejrůznější programovací jazyky a především mnohem náročnější učení (po nějaké době odpadá).

Nevýhodu bych spatřoval především v „OOP na bázi COM“. V žádném případě neznamená, že objektové programování = nepřenositelný program, nicméně ve spojení s COM bohužel ano. Dobře napsaný OOP program bývá přehlednější, robustnější a sndněji modifikovatelnější než strukturovaný, o špatně napsaném OOP programu se nebudu vyjadřovat, myslím, že každý jsme vytvořili minimálně jeden, ale spíše mnohem víc. Jestli je DirectX dobrý nebo špatný OOP, nedokáži objektivně posoudit, ve srovnání s OpenGL vidím především ty nevýhody.

Lidé, kteří zkoušejí Direct3D, na jeho objekty nadávají, a lidé, kteří zkoušejí OpenGL, zase chtějí, aby bylo objektové – co si vybrat? Mně osobně strukturální OpenGL naprosto vyhovuje, asi proto, že jsem na něj zvyklý, objekty mi připadají jako zbytečné komplikace. Mimochodem na COM, ActiveX a další technologie mám hodně negativní názor, takže raději bez komentáře.

Další výhodou Direct3D může být, že se přímo do něj neustále přidávají nové funkce, u nichž není vůbec podstatné, jestli je grafická karta podporuje. Pokud ne, mohou se bez nejmenších požadavků na programátora aplikovat softwarově, v OpenGL se musí o nepřítomnost efektu (extensionu) starat výhradně programátor. Je otázkou, zda se při kompletní softwarové emulaci nějakého efektu nestane hra natolik trhanou, že bude nehratelná (nemám zkušenosti).

U OpenGL se jakákoli supermoderní novinka zprovozňuje přes extensiony, ty ale také mají své plusy i mínusy. Pozitivní je, že se jakýkoli efekt může použít naprosto ihned po vydání karty a bez opětovného měnění základního standardu, jaké lze vidět u D3D (teď myšleno přidávání nových funkcí, ne změny stávajícího rozhraní).

Nevýhodou je, že pokud se rozšířením nevěnujete denně, ale pouze občas – spíše vůbec, máte v nich naprostý zmatek a nepoužíváte je, popř. používáte pouze malý zlomek z nich (můj případ). To, co mi na nich vadí nejvíce, je tedy jejich počet – odhaduji cca 300 a neustále roste :-(. Naproti tomu každá nová verze DirectX je ucelený balík, který „extensiony obsahuje bez toho, že se chovají jako extensiony“. Logicky vzato DirectX s každou novou verzí narůstá také a programátor se musí novinkám věnovat úplně stejně jako novým OpenGL extenzionům. Mám pravdu, nebo je to jenom blud?

Teď zapomeňte na DirectX, budu popisovat pouze OpenGL. Jistý příspěvek do diskuse: Takze OpenGL je vlastne jen maly jadro funkcionality plus milion nekompatibilnich rozsireni, ktery se lisej od implementace k implementaci? To je fakt ohromna vyhoda :) Ne, v žádném případě. Procesory CISC a RISC jsou dobrý příklad. CISC (Classic Instruction Set Computer) typicky implementuje instrukce na naprosto všechno, co si jen dokáže výrobce představit. RISC (Reduced Instruction Set Computer) jde naprosto opačnou cestou – implementuje pouze několik základních instrukcí a jejich kombinacemi umí provést úplně všechno co CISC. Přestože je nyní jedna instrukce nahrazena deseit podinstrukcemi a vykonání zabere desetkrát více času, jsou RISC mnohem výkonnější.

Jde o to, že cca 20 % všech instrukcí CISC (sčítání, odčítání, porovnání…) se vyskytuje v kódu v 80 % všech případů a zbývajících 80 % instrukcí (multimedia ap.) se využívá ve 20 % – tzv. zákon osmdesát dvaceti, dvacet osmdesáti. Základní OpenGL standard by se teoreticky dal přirovnat k RISC procesoru, OpenGL s extensiony k CISC, ale neberte to úplně doslova, jedná se o něco úplně jiného. Spousta grafických efektů (vertex a fragment shadery ap.) je natolik náročná, že implementovat je podinstrukcemi (softwarově) by bylo absolutně nereálné. Extensiony jsou v uvozovkách bonus, do kterého se sahá spíše výjimečně (těch 20 % případů, spíše mnohem méně), umí však až neskutečné věci.

Chyby a nepřesnosti z minulých dílů

První a celkem velká chyba je, že neexistuje nic s názvem DirectNet. Tento termín byl použit v literatuře, ze které jsem čerpal, ale máte pravdu, měl jsem si to ověřit. V diskusi se pak objevilo jméno DirectPlay.

Číslování verzí DirectX: I když v současnosti existuje DirectX 9.0 (plus něco na konci), není jich devět, ale méně/více. Některá čísla byla přeskočena a naopak bylo několik podverzí. Člověku, který nezačal na DirectX 1.0, by mělo podle mého názoru určení devíti verzí postačovat, ale díky, že jste mě opravili.

Nekompatibilita jednotlivých verzí DirectX: Osobně s tímto nemám žádné zkušenosti, ale když to řekne devět a půl člověka z deseti lidí :-) Podle toho, co jsem slyšel, přišlo téměř v každé nové verzi mnoho zlomových úprav, nicméně v tuto chvíli nedokáži posoudit, jestli je to pravda, nebo ne. Rozhraní knihoven by se obecně nemělo nikdy měnit – maximálně ve zlomových verzích, např. chystané OpenGL 2.0. Upřímně, kterou verzi (verze) DirectX byste označili jako podobně zlomovou?

Objektové DirectX: Neznám přesnou definici, ale za OOP jsem si vždy dosazoval slova jako třídy, objekty, metody, atributy a další věci, což DirectX určitě má. Každý člověk, který je trochu při smyslech, určitě chápe, že když se někde používají klíčová slova jako class ap., tak je označení OOP více než přiléhavé. Co lidi někdy nevygenerují… smajlík-nechápavého-kroucení-hlavou-).

Porovnání délky kódu ve druhém dílu :-((((( Asi jen tolik, že jsem byl totální magor, když jsem se do něčeho takového pouštěl. Ukázkový příklad nebyl reálný. Zapomenout na něj asi by nešlo, že?

Co se týče kontroly chyb při volání glVertex*(), které se nachází mimo glBegin/glEnd. Nevím jak vy, ale na tento problém jsem ještě nikdy nenarazil, a to i když jsem za dobu u OpenGL procházel zdrojáky od spousty naprostých začátečníků. Manuálové stránky (man glVertex) udávají, že „Invoking glVertex outside of a glBegin/glEnd pair results in undefined behavior“, takže pokud se správně pochopí slovní spojení nedefinované chování, je to jednotné naprosto na všech platformách :-), ale máte pravdu, jednotnější způsob by byl lepší. Kompilátor tuto chybu sice neodhalí, ale programátor s tím nemá absolutně žádné problémy. Toto téma patří spíše do teoretické roviny.

Troufám si říct, že OpenGL kód byl naprosto korektní, stejně jako jeho Direct3D verze. Chybové testy byly v celé knize o Direct3D doporučovány, jsou tedy nutné, nebo ne?! U OpenGL bych řekl, že spíše ne, možná výjimečně, ale určitě je naprosto zbytečné testovat každé glVertex() a glColor(), jestli proběhlo v pořádku – absolutní blbost.

U OpenGL renderingu jsem vertex arrays sice použít mohl, ale nepoužil. Jak už bylo mnohokrát zmíněno, programování v OpenGL a DirectX se ve své podstatě hodně liší, cílem byl ekvivalentní grafický efekt, NE zdrojový kód …nebo posloupnost vygenerovaných jedniček a nul :-)

Mohl bych pokračovat dál, ale článek začíná hodně narůstat.

Závěr

Abych to nějak zakončil, další pokračování určitě nebudou – Johance a vlastně všem čtenářům se ještě jednou omlouvám. Při psaní tohoto článku jsem pochopil, že na porovnání OpenGL a DirectX prostě nemám (konečně?). Pokud si myslíte, že vy ano, můžete to zkusit, ale nedoporučuji…

I s ultra gigantickými znalostmi skončíte vždy jako ten špatný. U mně to sice bylo z větší části způsobeno mými neznalostmi Direct3D, ale existuje spousta odborníků např. na Windows i Linux, kteří se je pokoušeli veřejně porovnat, a v důsledku toho je přestaly uznávat obě strany. Jediné, co vám mohu slíbit, je, že v budoucnu budu psát (pokud budu psát, ještě nevím) už jenom o tom, co opravdu ovládám a prakticky používám.

CS24_early

Na požádání – WOQ (zavináč) seznam.cz – vám můžu (pro osobní potřebu!) zaslat i další díly, které sice byly napsány, ale nevyjdou. Mazat se mi je nechce, byla na nich spousta práce. Čtení pouze na vlastní nebezpečí. Je to ve formátu HTML, ještě před rozsekáním na jednotlivé díly, které jsem pak poslal Johance, cca. 2 MB.

Závěrečná poznámka: Kdybych napsal tento článek jako první a zároveň poslední díl série, jak byste ho vzali?

Byl pro vás článek přínosný?

Autor článku

Backend programátor ve společnosti Avast, kde vyvíjí a spravuje BigData systém pro příjem a analýzu událostí odesílaných z klientských aplikací založený na Apache Kafka a Apache Hadoop.