Projekt iz kolegija "Računalna grafika"
Josip Bezi, Goran Sinovčić 11.01.2022.
U ovom radu pobliže ćemo pogledati mogućnosti razvija OpenGL aplikacija u jeziku C#. Prvo ćemo razmotriti neke popularne mogućnosti programiranja OpenGL-a u C#, te zatim pokriti potrebne korake instalacije i ovisnosti potrebne za izradu ovakve aplikacije.
Tao Framework je C# biblioteka koja programerima daje pristup bibliotekama poput OpenGL i SDL. Zadnja verzija je izašla 2008, pa je relativno zastarjela, te je trenutno napuštena. Postoji noviji fork pod nazivom TaoClassic koji je u razvoju od 2012. OpenTK je poboljšanje nad Tao API-jem, i koristi idiomatički C# stil, te podržava iznimke, enum-e i standardne .NET tipove, za razliku od Tao-a koji samo kopira C API. Također, zbog svoje popularnosti postoji velik broj tutoriala i framework je optimiziran za korištenje u C#, što olakšava primjenu.
Iz tih razloga, odlučili smo se na korištenje ovog framework-a. SharpGL je projekt koji također olakšava korištenje OpenGL-a, podržavajući do verzije 4.2, sa svim glavnim ekstenzijama i project template-ima za Visual Studio. Sastoji se od više srodnih biblioteka, neke od kojih se fokusiraju na WinForms, na serijalizaciju, WPF ili čak grafove. Ovo je isto relativno moderna i popularna biblioteka te je bila drugi izbor. Ova biblioteka također ima prednost da ju je moguće koristiti sa .NET Core-om.
Za korištenje OpenTK-a u C# programskom jeziku potrebno je prvo kreirati novi projekt sa .NET Core 3.x, .NET 5+ ili .NET Framework 4.x. Nakon što je kreiran projekt, u našem slučaju su to Windows Forme i .NET Frameworkom 4.8, dohvaćamo modul koji nam omogućuje korištenje OpenTK-a. Modul se dohvaća putem NuGet-a koji se otvara kako je prikazano na slici 1 Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution.
Slika 1. Otvaranje NuGet managera
Slika 2. Pretraživanje OpenTK
Kada je manager otvoren, tražimo OpenTK i instaliramo OpenTK i OpenTK.GLControl te unesemo reference u klasu čime možemo započet korištenje.
using OpenTK; using OpenTK.Graphics.OpenGL;
Kako je aplikacija napravljena putem Windows Formi, nakon instalacije paketa, u Toolboxu na editoru formi se nalaze nove kontrole. Odabiremo GLControl komponentu te povlačimo na samu formu. GLControl nam omogućuje za prikaz buffera i akcija koje smo definirali u kodu.
Kao i svaka kontrola, GLControl ima neke eventove kao što su Load i Paint koji su nama bitni. Event Load se izvršava kada se kontrola do kraja učita a Paint kada kontrola treba se iscrtati.
Za postavljanje buffera, matrica, boje i omogućavanje i onemogućavanje buffera koristimoi GL klasu koja se ne instancira.
Postavljanje moda matrice, tj definiranje koja matrica je trenutna matrica koristimo GL.MatrixMode().
Možemo omogućiti server-side mogućnosti sa GL.Enable().
Definiranje default boje čišćenja buffera : GL.ClearColor() kao i samo brisanje sa GL.Clear().
Podržano je i rotiranje trenutne matrice sa matricom rotacije putem GL.Rotate().
Jedan od najvećih točaka razlike u odnosu na labose jest jednostavnost postavljanja osvijetljenja. OpenTK omogučava jednostavan pristup na "visokoj razini" postavljanju parametra shader-a i upravljanju pre-definiranim svojstvima. Primjerice, postoji pre definirano svijetlo imena Light0 koje se može inicijalizirati i njegova svojsta promjeniti u svega par linija.
float[] light_position = { -30, 10, 5 }; float[] light_diffuse = { 0.8f, 0.8f, 0.8f }; float[] light_ambient = { 0.2f, 0.2f, 0.2f }; GL.Enable(EnableCap.Light0); GL.Light(LightName.Light0, LightParameter.Position, light_position); GL.Light(LightName.Light0, LightParameter.Diffuse, light_diffuse); GL.Light(LightName.Light0, LightParameter.Ambient, light_ambient);
Vidljivo je da su ovo zapravo samo bindigsi za OpenGL, te u komentarima parametara čak i kažu kako se zove originalni OpenGL parametar.
Druga svojstva shadera uključuju i definiranje svojstva materijala, poput specular refleksije, i koeficijenta refleksivnosti (suprotno od difuzivnosti). Kako bi osvijetljenje moglo izračunati kut refleksije svijetla u svakoj točki, potrebne su nam vektori normala, što su vektori okomiti na površinu plohe u toj točki. Svi vektori normala dodaju se u buffer kojim OpenTK u pozadini upravlja. Primjer dodavanje točki stožca je:
GL.Normal3(normaleStožac[i].x, normaleStožac[i].y, normaleStožac[i].z);
OpenTK omogućava vrlo brzu inicijalizaciju osvijetljenja koja omogućava da fokus bude na realizaciji ostatka programa (recimo igrice ili u ovom slučaju vjetrenjače...).
Kao primjer napravljen je vjetromjer u OpenTK alatu.