GDI+ i OpenGL

Sven Nilsen, student 2006

Det er ikke s� lett � f� til 2D-grafikk med bare polygoner som hjelpemiddel. Jeg �nsker � kunne bruke GDI+ kommandoer til � tegne mer avansert 2D-grafikk, som skal ligge opp� 3D-grafikken som tegnes i resten av programmet. Teknikken skal brukes til � lage interaktive kontroller.

Innledning

GDI+ er et kraftig verkt�y for 2D-grafikk som vi finner i C# og andre .NET-spr�k. Det g�r ann � tegne med GDI+ p� Bitmap-objekter (System.Drawing.Bitmap) som er en del av .NET Framework.

Med Tao OpenGL kan man gj�re om Bitmap-objekter til teksturer. Ved tegning kan man f�rst kalle opp rutinene som tegner med GDI+. Dette gj�res p� et Bitmap-objekt. S� gj�res Bitmap-objektet om til en tekstur, og tegnes som en quad. Bildet kan ogs� v�re delvis transparent. N�r man skal tegne menyer og 2D-kontroller, er det ikke n�dvendig � ha med dybdetesting. Uten dybdetesting g�r det ogs� raskere.

Struktur for grensesnitt

Vi lager en enkel modell for hvordan vi vil bygge opp et grensesnitt i 2D: Hver kontroll tegnes p� et bilde av samme st�rrelse som kontrollen. St�rrelset p� bildet m� ha dimensjoner 2^n i h�yde og bredde for � kunne gj�res om til tekstur. Denne st�rrelsen kan man regne ut automatisk ved f�lgende funksjon:

private int BufferSize(int size)
{
    return (int)(Math.Pow(2, Math.Ceiling(Math.Log(size) / Math.Log(2))));
}

Etter at vi har tegnet utseendet til kontrollen p� bildet, tegnes bildet som en tekstur p� et polygon:

Vi trenger ikke bare tegning, men brukeren skal ogs� kunne kommunisere med kontrollen ved hjelp av musen. For at ikke flere kontroller skal krangle om hvem som skal kommunisere, lager vi en klasse for � holde styr p� hvem som til enhver tid kommuniserer med musen. Klassen kaller vi ControlManager, og den tar seg av b�de tegning av kontroller og kommunisering mellom bruker og kontroll.

Alle kontroller m� arve fra klassen SimpleControl. Denne klassen inneholder egenskaper for posisjon og st�rrelse til kontrollen.

Objekthiarki

S� lenge ingen av kontrollene kommuniserer med brukeren, blir alle kontroller spurt om de vil opprette kommunikasjon etter hvert som brukeren flytter musen. Sjekken skjer mot en rektangel som definerer plassering og st�rrelsen av kontrollen. Dersom musen befinner seg innenfor en slik rektangel, sp�rres kontrollen som denne rektangelen tilh�rer om den vil opprette kommunikasjon. Hvis ikke kontrollen vil, fortsetter sjekkingen med de andre kontrollene. Sjekkingen skjer i motsatt rekkef�lge av tegnerekkef�lgen, slik at kontroller som tegnes �verst, vil sp�rres f�rst.

I ControlManager er det variabelen �m_capturingControl� som bestemmer hvilken kontroll som har kommunikasjonen.

N�r en kontroll oppretter kommunikasjon, f�r den tilsendt et objekt som representerer vinduet grafikken tegnes i. Gjennom dette objektet kan kontrollen koble seg p� de ulike input den �nsker. S� lenge musen beveger seg, sp�rres kontrollen om den vil avslutte kommunikasjonen. N�r kommunikasjonen er avsluttet, kan andre kontroller opprette kommunikasjon.

Ved denne metoden kan for eksempel brukeren flytte en slidebar p� maksverdi uten � miste �taket� n�r musen forflytter seg utenfor kontrollen.

Effekter og farger

Spill og 3D grafikk oppdaterer tegning vanligvis et visst antall ganger i sekundet. Dette kan vi utnytte til � lage effekter som endrer seg over tid. For eksempel kan fargen p� knapper endres gradvis n�r brukeren holder musen over den.

Den enkleste m�ten � lage en fade-effekt med farger, er � lage en egen klasse som h�ndterer dette. Vi har kalt klassen v�r for �ColorFadeEffect�. Klassen inneholder to metoder, en for � starte fading, og en for � g� tilbake. Intervallet bestemmes i millisekunder, og angir hvor lang tid det skal g� f�r fargen er ferdig fadet. �ColorFadeEffect� har innebygd funksjon for � fortsette fra det stedet man var sist, dersom fargen var halveis ferdig fadet f�r man vil g� tilbake. Kontrollen som skal fade farge, oppretter et objekt av typen �ColorFadeEffect�, og henter ut fargen med funksjonen �GetColor�.

Ofte �nsker man et spesielt utseende p� grensesnittet som passer til programmet man lager. Ved � la alle kontroller bestemme fargevalg ut ifra en felles klasse, beh�ver man ikke � endre fargene flere steder siden. Klassen heter �GuiLook�. Hver kontroll f�r angitt et GuiLook-objekt i konstrukt�ren.

Referanser

Forklaringer

Event - En m�te � abonnere p� en hendelse i .NET spr�k. Funksjoner kan kobles mot en event, og funksjonen blir da kalt opp n�r hendelsen skjer.

Eksempel

Se
Shape Blending