OpenTK

Projekt iz kolegija "Računalna grafika"

Josip Bezi, Goran Sinovčić 11.01.2022.

Uvod

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.

OpenGL ES 2+ u C#

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.

Instalacija

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;
                

Korištenje

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().

Osvjetljenje

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...).

Vjetromjer u OpenTK

Kao primjer napravljen je vjetromjer u OpenTK alatu.

Slika 3. Vjetromjer
Slika 4. Vjetromjer - rotacija

Literatura

Izvorni kod