Not again... Vertex normals and lights

Started by
5 comments, last by Weston 20 years, 9 months ago
I didn't expect lighting to be so frusterating. So far, my program has a quad that faces the camera. It has a texture on it and also has a transparent area. This program is just to get me familiar with lights. However, everything works until I tried to add in lights. I assumer it's because of my normals not being set up correctly. Take a look and see if I'm missing anything. (I'm not going to put in the entire source code, so don't worry about it) Program details: Camera position: (0, 0, -500) Camera target: (0, 0, 0) World orientation: (0, 1, 0) Light type: Point Quad is centered on the origin facing the camera and rotates on the Z axis. It has a texture on it. Everything works perfectly until I tried to add lighting. And this is some of my initialization function:

struct VERTEX3D
{
	D3DXVECTOR3 Position;
	D3DXVECTOR3 Normal;		
	FLOAT u, v;
};
//

// My verticies

VERTEX3D Verts[4];
Verts[0].Position = D3DXVECTOR3(-100.0f, -100.0f, 0.0f);
Verts[0].Normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
Verts[0].u = 0.0f;
Verts[0].v = 1.0f;
Verts[1].Position = D3DXVECTOR3(-100.0f, 100.0f, 0.0f);
Verts[1].Normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
Verts[1].u = 0.0f;
Verts[1].v = 0.0f;
Verts[2].Position = D3DXVECTOR3(100.0f, -100.0f, 0.0f);
Verts[2].Normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
Verts[2].u = 1.0f;
Verts[2].v = 1.0f;
Verts[3].Position = D3DXVECTOR3(100.0f, 100.0f, 0.0f);
Verts[3].Normal = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
Verts[3].u = 1.0f;
Verts[3].v = 0.0f;
//

// Light structure

D3DLIGHT8 d3dlight;
//

//////////////////////////////////////////////////////////

//

// Set render states

D3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
D3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
D3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
D3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
D3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
D3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
D3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x01);
D3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
//

//////////////////////////////////////////////////////////

//

// Set up the light

d3dlight.Type = D3DLIGHT_POINT;
d3dlight.Position = D3DXVECTOR3(0.0f, 20.0f, -200.0f);
d3dlight.Diffuse.r = d3dlight.Ambient.r = 1.0f;
d3dlight.Diffuse.g = d3dlight.Ambient.g = 1.0f;
d3dlight.Diffuse.b = d3dlight.Ambient.b = 1.0f;
d3dlight.Diffuse.a = d3dlight.Ambient.a = 1.0f;
d3dlight.Attenuation0 = 1.0f;
d3dlight.Range = 1000.0f;

D3DDevice->SetLight(0, &d3dlight);
D3DDevice->LightEnable(0, TRUE);
I probably have my normals set wrong. I've tried different combinations, but nothing works so far. I couldn't find any good tutorials on calculating them either. So, do you see anything wrong, or should I just skip lighting until I need it? I want to get out of this chapter in the book soon. [edited by - Weston on July 25, 2003 3:35:24 PM] [edited by - Weston on July 25, 2003 6:07:02 PM]
---Will DDR for food.
Advertisement
Well, your vertices all have the same position

EDIT- I just checked it again and they don't. I could've sworn they didn't. What FVF flags are you using?


[edited by - FlamePixel on July 25, 2003 5:21:49 PM]
quote:Original post by FlamePixel
Well, your vertices all have the same position


hmm...no they don''t? i''ll have to take a better look at your code later.

---
Brent Gunning | My Site
All the normals are pointing straight up the y axis, therefore no light is "reflecting" towards the camera. The normals should be (0,0,-1), this way the light is "reflecting" towards you.

I should probably be working now...
I should probably be working now...
I have the D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 flags, so it should be just fine.

I also changed the vectors to (0.0f, 0.0f, -1.0f) but still no image shows up.

Do I have to specify anything in the texture to allow lighting, or should that jsut be automatic?

Thanks for your suggestions.
---Will DDR for food.
Do you have a material set up? Ambient light is indiffernt to normals etc - try setting that to someting obvious and work until you at least see that. Then you know your renderstates/materials/matrices are correct at least!
No book said I have to set up a material before setting a texture. It works now. Thanks to all that replied!

[edited by - Weston on July 26, 2003 1:49:29 AM]
---Will DDR for food.

This topic is closed to new replies.

Advertisement