#4 Direct3D Lighting

 

Inleiding

 

In deze tutorial laat ik zien hoe je lighting kan gebruiken in D3D. We moeten hiervoor wel het een en ander verbouwen aan het programma van de vorige tut.Maar dat zal geen probleem zijn.

 

De start

 

Allereerst gaan we de CUSTOMVERTEX aan passen. We gaan namelijk niet meer werken met een driehoek, maar met een cylinder. De CUSTOMVERTEX komt er zo uit te zien.

 

struct CUSTOMVERTEX

{

                D3DXVECTOR3 position; // 3d positie

                D3DXVECTOR3 normal;   // normaal oppervlakte

};

 

Je ziet dat ik de x,y,z coördinaten weglaat. De 1e is de 3D positie van het object, de 2e gaat over zijn oppervlakte. We moeten wel gelijk de define veranderen. Die komt er dan zo uit te zien.

 

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

 

Ik hoop dat je zelf ook wel door had, dat je deze moest veranderen. Want je moet nu wel doorhebben dat als je iets veranderd, dat je wel moet bedenken of je niet gelijk iets anders moet veranderen. In ons geval een define, maar het kan dus ook een functie of iets dergelijks zijn.

 

Zoals ik al zei werken we niet meer met een driehoek, dus moeten we het en ander in de toewijzingen van geheugen aanpassen. Dus we passen de CreateVertexBuffer() aan.

 

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

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

                {

                                return E_FAIL;

                }

 

Het gaat om het cursieve gedeelte. De rest is standaard. We slaan op deze manier genoeg gegevens op om een cylinder te maken.

 

Nu gaan we de vertex buffer vullen met gegevens. We gaan iedere punt instellen op positie en surface.

 

for( DWORD i=0; i<50; i++ )

    {

        FLOAT theta = (2*D3DX_PI*i)/(50-1);

        pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );

        pVertices[2*i+0].normal   = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );

        pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );

        pVertices[2*i+1].normal   = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );

    }         

 

Met deze code hebben we nu een cylinder gemaakt. Om het best uit te vinden hoe de code in mekaar steekt, moet je zelf maar een beetje met de getallen rommelen.

 

Voordat je lichten kan gebruiken in je project, moet je het object eerst een material geven. Dit is belangrijk voor de reflectie en dergelijke. Dus we gaan nu als eerste een material maken.

 

D3DMATERIAL9 mtrl;

    ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );

    mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;

    mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;

    mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;

    mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;

    g_pd3ddevice->SetMaterial( &mtrl );

 

Met deze instelling maken we de reflectie geel.  Ook hier weer,  ga een beetje met de getallen vogelen om uit te zoeken hoe het werkt. Met SetMaterial leg je de instellingen vast.

 

D3DXVECTOR3 vecDir;

D3DLIGHT9 light;

ZeroMemory( &light, sizeof(D3DLIGHT9) );

light.Type       = D3DLIGHT_DIRECTIONAL;

 

We hebben nu een gericht licht aangemaakt.

 

light.Diffuse.r  = 1.0f;

light.Diffuse.g  = 1.0f;

light.Diffuse.b  = 1.0f;

 

We hebben nu de kleur van het licht ingesteld op wit.

 

vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f), 1.0f,

                                         sinf(timeGetTime()/350.0f) );

D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

 

Met dit stukje code laten we de richting (!!) van het licht draaien in een cirkel.

 

light.Range       = 1000.0f;

 

Tot hoever heeft het licht effect.

 

g_pd3ddevice->SetLight( 0, &light );

 

Stel het licht in

 

g_pd3ddevice->LightEnable( 0, TRUE );

 

Zet het licht aan

 

g_pd3ddevice->SetRenderState( D3DRS_LIGHTING, TRUE );

 

Rendert het licht.

 

g_pd3ddevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );

 

Zet ook ambient lghting aan. Hier gebruiken we een lichte grijze kleur.

 

Dit was het al weer. Ook deze source staat weer online op http://home.kabelfoon.nl/~pderaaij/tuts/light.cpp

 

Bekijk hem wat je moet nog het een en ander aan kleine dingetjes veranderen.

 

Groetjes,

Paul

ICQ: 57088090