#2 Direct3D9, Weergeven

 

Inleiding

 

Zoals de naam het al zegt, we gaan nu wat weergeven. Wat? Zal je je misschien. Het antwoord is een driehoek, met iedere hoek een andere kleur. Spannend, JA! Dus we gaan gauw beginnen.

 

De tutorial

 

Goed, de vorige tutorial hebben jullie dus geleerd hoe je Direct3D9 initialiseerd. Nu gaan we daar eindelijk wat mee doen, we gaan dus die driehoek tekenen. Dit is iets gecompliceerder dan je eigenlijk zou zeggen.

 

Een driehoek bestaat uit 3 punten, in het Engels noemt men dat Vertices en zo zullen ook wij dat noemen in de komende tijd.

 

In Direct3D moet je een buffer maken om al die punten op te slaan. Dat wordt de vertexbuffer genoemd. Hierin sla je dus de vertices op. Deze vertices kun je naar je eigen smaak maken. We maken dan ook gebruik van het Flexible Vertex Format (FVF). Dit houdt in feite gewoon in dat je zelf kan bepalen wat voor informatie je voor de vertices gebruikt.

 

Die format moet je namelijk wel declaren zodat je programma ook weet hoe je FVF in mekaar steekt. We doen dat op de volgende manier.

 

struct CUSTOMVERTEX

{

                float x, y, z, rhw;

                DWORD  colour;

};

 

We willen opslaan als informatie de x,y & z positie. Ja, niet alleen x & y! Ook z, vergeet niet het is 3D, dus we hebben ook te maken met een diepte as. Daarnaast slaan we ook de kleur op. RHW staat voor Reciprocal Homogeneous W. Ik weet niet waar voor het staat, maar het wil gewoon zeggen dat als je deze gebruikt, dat je vertices al getransformeerd is.  Dit is niet zo heel belangrijk.

 

We gaan nu vertellen wat voor FVF we gebruiken, dit doen we in een define zodat we dat straks makkelijk kunnen gebruiken

 

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

 

Nu dat we de custom vertex hebben ingesteld, gaan we de vertex buffer invullen. Ik doe dit in een andere functie, maar dat kan je straks in de totale source zien.

CUSTOMVERTEX cvVertices[] =

                {

                                {250.0f, 100.0f, 0.5f, 1.0f, 0xffff0000,}, // x, y,z, rhw, colour

                                {400.0f, 350.0f, 0.5f, 1.0f, 0xff00ff00,},

                                {100.0f, 350.0f, 0.5f, 1.0f, 0xff00ffff,},

                };

 

Zoals je ziet is het niet zo heel moeilijk. Allereerst stel je de x,y,z as in. Dan de rhw op 1.0 zodat je laat weten dat hij getransformeerd is. Wat wil zeggen dat je x & y as op basis van het 2D-assenstelsel zijn berekend. Dus de 0 linksboven in x naar rechts, y naar beneden optellend.

 

Vervolgens stel je de kleur in. Ik gebruik hier de hexadecimale maar je kan hier ook de macro D3D_XRGB() gebruiken. Werkt het zelfde.

 

Vervolgens roepen CreateVertexBuffer aan. Dat doen we zo.

 

// create vertex buffer in device

                if(FAILED(g_pd3ddevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),

                                0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL)))

                {

                                return E_FAIL;

                }

 

De 1e parameter geeft de grootte van de buffer aan, in dit geval 3x een vertex. De 2e parameter is de usage, deze kan je gewoon op 0 laten staan. De 3e parameter verwijst naar het type vertex wat we gebruiken. In ons geval een zelfgemaakte en met behulp van D3D_FVF_CUSTOMVERTEX zoekt hij de instellingen op en laadt die. D3DPOOL_DEFAULT geeft aan dat we de vertex buffer op de best geschikte plaats gebruiken. In de inmiddels 5e parameter komt het geheugenadres van de buffer. De laatste parameter is voor toekomstig gebruik en kan je gewoon op NULL zetten.

 

Na het maken van een buffer is het gevuld met vertices zoals je hieronder kan zien.

 

void* pVertices;

// get pointer to vertex buffer and lock it

                if(FAILED(g_pVertexBuffer->Lock(0, sizeof(cvVertices), (void**)&pVertices, 0)))

                {

                                return E_FAIL;

                }

 

                // copy stored vertices in vertex buffer

                memcpy(pVertices, cvVertices, sizeof(cvVertices));

 

                // unlock

g_pVertexBuffer->Unlock();

 

Hier gebeurt het een en ander wat uitleg behoeft. Voordat we iets met de vertex buffer doen sluiten we hem af. Dit doen we uit voorzorg zodat er niks met de gegevens kan gebeuren als wij er mee bezig zijn. Vervolgens kopieren we de vertex buffer. CvVertices is de vertex buffer, die kopieren we in pVertices. Als dat gebeurd is doen we de boel weer open en zijn we klaar met de vertex buffer en gaan we echt wat tekenen.

 

// clear backbuffer to a blue color

                g_pd3ddevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);

 

                // begin scene

                g_pd3ddevice->BeginScene();

 

               

                // end scene

                g_pd3ddevice->EndScene();

 

                // flip back en front buffer

                g_pd3ddevice->Present(NULL, NULL, NULL, NULL);

 

De code die jullie nu zien komt je als het goed is bekend voor. Dit is de basis teken code, daar gaan we nu iets aan veranderen. Allereerst maken we nog steeds het scherm schoon en geven er een blauwe achtergrond aan. Dan geven we aan dat we beginnen met tekenen door BeginScene(). Eerst gaan we een stream instellen,in dit geval stream 0.

 

g_pd3ddevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX));

 

De 1e parameter identificeert de bron van de data stroom. De 2e parameter is hetgeen wat aan die datastroom gebonden moet worden in ons geval de vertex buffer. Vervolgens geef je nog de grootte van een vertice mee.

 

Dan gaan we de FVF instellen dat doe je zo.

 

g_pd3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);

 

Je geeft de vertices lay-out mee. Dus gewoon hoe je vertices in elkaar steekt. Meer is het niet. En dan nu….!!

 

Nu gaan we echt tekenen. We gaan de driehoek tekenen en het is zo simpel dat het in 1 regel gebeurd is!

 

g_pd3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

 

Dit is al genoeg code om een driehoek te tekenen. De 1e parameter is om aan te geven wat voor figuur je tekent.

 

0 is om aan te geven met welke vertices het moet beginnen. Omdat er maar 1 driehoek is stellen we de 3e parameter op 1 in.

 

En dat was het eigenlijk, meer is er niet aan. Denk wel nog even aan het opruimen. Maar dat snap je denk wel, zo niet kijk dan nog even in de bron code. Die overigens  te vinden is op de volgende link. <A href=”http://home.kabelfoon.nl/~pderaaij/tuts/tutorial.cpp>Klik Hier</a>

 

Voor meer informatie kun je contact met mij opnemen.

 

ICQ -> 57088090

MSN -> insiej@hotmail.com

 

Groetjes,

Paul de Raaij