Advertisement

Lighting and Sprites

Started by July 22, 2014 02:10 PM
0 comments, last by cozzie 10 years, 6 months ago

Hello,

I currently have a 2d engine, and I wanted to add lighting to it. I am not well versed in graphical programming (hence posting it in beginners). After following a few tutorials online I have managed to implement lights into my engine (kinda) that being I can draw a 2D plane (which I manually input the vertices) with the lighting effects.

OtYGchR.png

However, when ever I draw a sprite (see code below). The lighting effect is not present, it is the original image. I think, although I am unsure, this may have to do something with LPD3DXSPRITE (what I am using as the actual sprite) I suspect this does not have any vertices hence no normal that are required for the light effect to be shown. Is this correct?

If it is correct how would I go about correcting this? Would I have to create vertices for each sprite image and add a texture to it? If this is the case I would appreciate some guidance on how to do this. If it is not correct, what is my problem, I have been scratching my head for a while now :/

Sprite drawing:


void Graphics::drawSpriteWithOffset(const SpriteData &spriteData, 
int x, int y, COLOR_ARGB colour)
{

/**Stuff*/


	D3DXMATRIX matrix;
	D3DXMatrixTransformation2D(&matrix, NULL, 0.0f, &scaling, &spriteCenter, (float) (spriteData.angle), &translate);

	sprite->SetTransform(&matrix);
	sprite->Draw(spriteData.texture,&spriteData.rect,NULL,NULL,colour);
}

Creating the Light:


void Graphics::init_light(void)
{
    D3DLIGHT9 light;    // create the light struct
    D3DMATERIAL9 material;    // create the material struct

    ZeroMemory(&light, sizeof(light));    // clear out the light struct for use
    light.Type = D3DLIGHT_DIRECTIONAL;    // make the light type 'directional light'
    light.Diffuse = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f);    // set the light's color
    light.Direction = D3DXVECTOR3(-1.0f, 0.0f, 1.0f);

    device3d->SetLight(0, &light);    // send the light struct properties to light #0
    device3d->LightEnable(0, TRUE);    // turn on light #0

    ZeroMemory(&material, sizeof(D3DMATERIAL9));    // clear out the struct for use
    material.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);    // set diffuse color to white
    material.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);    // set ambient color to white

    device3d->SetMaterial(&material);    // set the globably-used material to &material
}

Any help is appreciated, smile.png

Mobile Developer at PawPrint Games ltd.

(Not "mobile" as in I move around a lot, but as in phones, mobile phone developer)

(Although I am mobile. no, not as in a babies mobile, I move from place to place)

(Not "place" as in fish, but location.)

Hi.
Drawing the sprite as a quad with 4 vertices, using the sprite image as a texture should work fine. Where you would technically be working in 3d, which basically all Z values 1. This actually creates nice opportunities for further development. Make sure you use a vertex format including normals. A directional light for example could have direction 1,0,0 meaning it would point straight towards sprites facing "the camera" (quads at Z is 1).

From your code I also see your using the fixed function pipeline, you might want to take a look at using shaders (starting with LPD3DXEFFECT as a start), this gives immensive possibilities on how in your case, your quad and eventually its textured pixels will be drawn on screen.

Crealysm game & engine development: http://www.crealysm.com

Looking for a passionate, disciplined and structured producer? PM me

This topic is closed to new replies.

Advertisement