3D grafika pro .NET snadno a rychle

Při vývoji aplikaci (zejména v oblasti zpracování dat) se čas od času vyskytne potřeba zobrazit zpracovávaná data. V případě, že vyvíjená aplikace je jen prototyp nebo nepočítáte s jejím dalším využitím, je zbytečné učit se kvůli jednomu experimentu nové a komplexní API pro zobrazení dat. Zvláště v případě, že již máte z dřívějších dob zkušenosti s jiným rozhraním, například s OpenGL.

Právě do takové situace jsem se dostal při práci na programu pro seminář k přednášce Implementace neuronových sítí II. Mojim cílem bylo rychle a s vynaložením co nejmenší námahy naprogramovat zobrazení kohonenovské sítě operující v trojrozměrném vstupním prostoru (jednotlivé neurony lze reprezentovat jako body v 3D prostoru).

Požadovaným výsledkem bylo zobrazení několika desítek neuronů a zobrazení spojů mezi sousedními neurony v mřížce. Pro reprezentaci neuronu bohatě postačí “koule” složená z dvacítky polygonů, pro spoje jednoduché čáry. Dokud jsem síť potřeboval zobrazit jen ve dvou rozměrech, bylo možné používat velice komfortní grafické funkce z prostoru System.Drawing. S druhým rozměrem ale jejich možnosti končí a Microsoftem podporované Managed DirectX je dimenzované pro větší projekty vyžadující vyšší výkon a možnost využívat pokročilé funkce moderních grafických karet. Zřejmě i proto v něm chybí možnost jak jednoduchým způsobem kreslit základní grafická primitiva.

OpenGL vrací úder

Při pohledu du Managed DirectX dokumentace jsem se slzou v oku zavzpomínal na krásné časy s glBegin, glEnd a glVertex při programování grafického engine Projektu 5410 a pokusil se spolu s Googlem najít způsob, jak spojit výhodu jednoduchého programování grafiky pomocí OpenGL s výhodou rychlého psaní kódu v C# (a samotřejmě s hotovými třídami pro kohonenovské sítě) a po chvíli hledání se zjevilo řešení téměř dokonalé – CsGL.

Podle seznamu novinek na webu knihovna už skoro třetím rokem není udržovaná, to ale nic nemění na její použitelnosti a užitečnosti. K dispozici programátorům dává kompletní rozhraní OpenGL 1.4 s vybranými rozšířeními (kompletní seznam podporovaných je na webu). Součástí jsou i funkce z GLU a vybrané funkce z GLUT.

Objektově orientováno

Protože OpenGL samo není objektové rozhraní, museli se autoři CsGL vyrovnat s přenosem na platformu, která naopak je na objekové orientovanosti založena. Samotné funkce glXXX zůstávají statické a jejich efekty se vážou vždy k aktuálnímu grafickému kontextu. I přes neobjektovost velké části rozhraní OpenGL se ale autorům podařilo několik samostatných tříd izolovat – především se jedná o grafický kontext reprezentující aktuální výstupní okno a o framework zjednodušující vytváření aplikací, který nahrazuje funkce pro práci s okenním systémem z GLUT.

Začlenění frameworku zajišťujícího vytvoření okna a vlastní smyčky zpráv do existující aplikace je skoro nemožné, proto jsem při práci ocenil spíše ovládací prvek OpenGLControl, který ve standardní třídě Control přidává možnost vykreslovat obsah ovládacího prvku pomocí funkcí CsGL místo obvyklého System.Drawing. Vytvoření komponenty zobrazující požadovanou trojrozměrnou neuronovou síť pak už bylo dílem okamžiku.

Další vývoj

Jak už jsem psal na začátku příspěvku, knihovna od poloviny roku 2003 není dále vyvýjena a udržována, to ale neznamená, že by se jednalo o slepou vývojovou cestu. Další vývoj totiž probíhá v rámci projeku Mono, kde je pod názvem Tao vytvářena komplexní knihovna pro vývoj her a multimediálních aplikací – kromě OpenGL ve verzi 1.5 jsou podporovány i další knihovny a API jako je OpenAL pro práci se zvukem, ODE pro fyziku pevných těles nebo vše sdružující platformově nezávislé SDL.

Narozdíl od CsGL se knihovna Tao snaží o maximální nezávislost na platformě, která může být výhodou, ale na druhou stranu z pochopitelných důvodů došlo k znatelnému nárůstu velikosti dll knihoven a potenciálnímu snížení výkonu. Proto pokud cílem je jednoduchá aplikace pro platformu Windows, která nepoužívá nejnovější funkce grafických akcelerátorů, je menší a specifičtěji zaměřené CsGL stále dobrou volbou.

Bookmark and Share

Comments are closed.