Public Group

#### Archived

This topic is now archived and is closed to further replies.

# Need help with Vertex Normal Vectors

This topic is 6014 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi! I have been trying now for some time to set up some test light just to see how things work. When I load a texture, without lights, and run the exe my picture shows up on the screen. But when the lights are turned on the screen is complete black. What I figured is that my normals must be all wacko and that maybe the at Gamedev could help. So please help me... I know this ain''t looking too good... // Koordinates pVERTEX[0].position = D3DXVECTOR3(DestX1,DestY1,1.0f); pVERTEX[1].position = D3DXVECTOR3(DestX2,DestY1,1.0f); pVERTEX[2].position = D3DXVECTOR3(DestX2,DestY2,1.0f); pVERTEX[3].position = D3DXVECTOR3(DestX1,DestY2,1.0f); // normal calculations float modulus[4]; modulus[0] = (float)sqrt((DestY2-DestY1)*(DestY2-DestY1)+(DestX1-DestX2)*(DestX1-DestX2)+(DestX1*DestY1-DestX2*DestY2)*(DestX1*DestY1-DestX2*DestY2)); modulus[1] = (float)sqrt((DestY2-DestY1)*(DestY2-DestY1)+(DestX1-DestX2)*(DestX1-DestX2)+(DestX1*DestY1-DestX2*DestY2)*(DestX1*DestY1-DestX2*DestY2)); modulus[2] = (float)sqrt((DestY1-DestY2)*(DestY1-DestY2)+(DestX2-DestX1)*(DestX2-DestX1)+(DestX2*DestY2-DestX1*DestY1)*(DestX2*DestY2-DestX1*DestY1)); modulus[3] = (float)sqrt((DestY1-DestY2)*(DestY1-DestY2)+(DestX1-DestX2)*(DestX1-DestX2)+(DestX1*DestY2-DestX2*DestY1)*(DestX1*DestY2-DestX2*DestY1)); pVERTEX[0].normal = D3DXVECTOR3((DestY2-DestY1)/modulus[0], (DestX1-DestX2)/modulus[0], (DestX1*DestY1-DestX2*DestY2)/modulus[0]); pVERTEX[1].normal = D3DXVECTOR3((DestY2-DestY1)/modulus[1], (DestX2-DestX1)/modulus[1], (DestX2*DestY1-DestX1*DestY2)/modulus[1]); pVERTEX[2].normal = D3DXVECTOR3((DestY1-DestY2)/modulus[2], (DestX2-DestX1)/modulus[2], (DestX2*DestY2-DestX1*DestY1)/modulus[2]); pVERTEX[3].normal = D3DXVECTOR3((DestY1-DestY2)/modulus[3], (DestX1-DestX2)/modulus[3], (DestX1*DestY2-DestX2*DestY1)/modulus[3]);

##### Share on other sites
How about settings up the normals like this:

pVERTEX[...].normal = D3DXVECTOR3(0.0f, 0.0f, -1.0f);

Shouldn''t that work? Sorry if that''s a dumb idea, but i am unable to figure out what you are trying to achieve, i.e. what is the expected result of your calculations?

##### Share on other sites
Well thats what I figured at first but that didn''t seem to work so I found an article here at gamedev.net. In this article there is a formula for calculating normals.

http://www.gamedev.net/reference/articles/article1832.asp

Maybe I have made some errors else where.

  void LoadPicture( IDirect3DTexture8 **TEXTURE, PANELVERTEX *pVERTEX, LPCTSTR szImage, DWORD TRANSCOLOR, 							float DestX1, float DestY1, float DestX2, float DestY2,											IDirect3DVertexBuffer8 **VERTEX_BUFFER){	IDirect3DVertexBuffer8 *tmp_VERTEX_BUFFER;		D3dDevice->CreateVertexBuffer(4 * sizeof(PANELVERTEX), D3DUSAGE_WRITEONLY,						D3DFVF_PANELVERTEX, D3DPOOL_MANAGED, &tmp_VERTEX_BUFFER);	tmp_VERTEX_BUFFER->Lock(0, 4 * sizeof(PANELVERTEX), (BYTE**)&pVERTEX, 0);// Sätter rektangelns färg till vitt	pVERTEX[0].color = pVERTEX[1].color = pVERTEX[2].color = pVERTEX[3].color = 0xffffffff;// Koordinaterna	pVERTEX[0].position = D3DXVECTOR3(DestX1,DestY1,1.0f);	pVERTEX[1].position = D3DXVECTOR3(DestX2,DestY1,1.0f);	pVERTEX[2].position = D3DXVECTOR3(DestX2,DestY2,1.0f);	pVERTEX[3].position = D3DXVECTOR3(DestX1,DestY2,1.0f);// normalerna	float modulus[4];		modulus[0] = (float)sqrt((DestY2-DestY1)*(DestY2-DestY1)+(DestX1-DestX2)*(DestX1-DestX2)+(DestX1*DestY1-DestX2*DestY2)*(DestX1*DestY1-DestX2*DestY2));		modulus[1] = (float)sqrt((DestY2-DestY1)*(DestY2-DestY1)+(DestX1-DestX2)*(DestX1-DestX2)+(DestX1*DestY1-DestX2*DestY2)*(DestX1*DestY1-DestX2*DestY2));		modulus[2] = (float)sqrt((DestY1-DestY2)*(DestY1-DestY2)+(DestX2-DestX1)*(DestX2-DestX1)+(DestX2*DestY2-DestX1*DestY1)*(DestX2*DestY2-DestX1*DestY1));		modulus[3] = (float)sqrt((DestY1-DestY2)*(DestY1-DestY2)+(DestX1-DestX2)*(DestX1-DestX2)+(DestX1*DestY2-DestX2*DestY1)*(DestX1*DestY2-DestX2*DestY1));		pVERTEX[0].normal = D3DXVECTOR3((DestY2-DestY1)/modulus[0], (DestX1-DestX2)/modulus[0], (DestX1*DestY1-DestX2*DestY2)/modulus[0]);		pVERTEX[1].normal = D3DXVECTOR3((DestY2-DestY1)/modulus[1], (DestX2-DestX1)/modulus[1], (DestX2*DestY1-DestX1*DestY2)/modulus[1]);		pVERTEX[2].normal = D3DXVECTOR3((DestY1-DestY2)/modulus[2], (DestX2-DestX1)/modulus[2], (DestX2*DestY2-DestX1*DestY1)/modulus[2]);		pVERTEX[3].normal = D3DXVECTOR3((DestY1-DestY2)/modulus[3], (DestX1-DestX2)/modulus[3], (DestX1*DestY2-DestX2*DestY1)/modulus[3]);// textur koordinater	pVERTEX[1].u = pVERTEX[2].u = 1.0f;	pVERTEX[0].u = pVERTEX[3].u = 0.0f;	pVERTEX[0].v = pVERTEX[1].v = 0.0f;	pVERTEX[2].v = pVERTEX[3].v = 1.0f;	tmp_VERTEX_BUFFER->Unlock();		*VERTEX_BUFFER = tmp_VERTEX_BUFFER;	IDirect3DTexture8 * tmp_TEXTURE;		D3DXCreateTextureFromFileEx(D3dDevice, szImage, 0, 0, 0, 0,                            D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT,                            D3DX_DEFAULT , TRANSCOLOR, NULL, NULL, &tmp_TEXTURE);	*TEXTURE = tmp_TEXTURE;}

Setting up the lights:

  // Sätt materialens reflections egenskaper.	ZeroMemory( &material, sizeof( D3DMATERIAL8 ) );		material.Diffuse = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );		material.Ambient = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );		//material.Specular = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );;		//mat.Power = 50.0f;		//mataterial.Emissive = D3DXCOLOR( 0.0f, 0.0f, 0.0f, 0.0f );	D3dDevice->SetMaterial(&material);// Ljus	ZeroMemory(&d3dlight, sizeof( D3DLIGHT8 ) );		d3dlight.Type = D3DLIGHT_POINT;		d3dlight.Diffuse = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );		d3dlight.Ambient = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );		//d3dlight.Specular = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );		//d3dlight.Direction = D3DXVECTOR3( 0.0f , 0.0f, 1.0f );	D3dDevice->SetLight( 0, &d3dlight );	D3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

Drawing the scene:

  void DrawScene(){	D3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0 );	D3dDevice->BeginScene();	Init2dMatrices();	D3dDevice->SetStreamSource(0, vb_BackGround, sizeof(PANELVERTEX));	D3dDevice->SetVertexShader(D3DFVF_PANELVERTEX);	//D3dDevice->LightEnable( 0, TRUE );	D3dDevice->SetTexture(0, t_BackGround);	D3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);	D3dDevice->EndScene();	D3dDevice->Present(NULL, NULL, NULL, NULL);}

##### Share on other sites
I''m also new to the D3D programming so I''m mainly guessing: I think you need to also enable the light after setting it:

D3dDevice->SetLight( 0, &d3dlight );
D3dDevice->LightEnable(0, TRUE);

##### Share on other sites
Haha!! Now this is wierd...It seems as if I don''t need any normals anymore. I can''t alter my light properties either or anything else. I think I''m starting to go crazy, everything I do turns out wrong =(...

Does this seem right to you?:

ZeroMemory( &material, sizeof( D3DMATERIAL8 ) );
material.Diffuse = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );
material.Ambient = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );
D3dDevice->SetMaterial(&material);

ZeroMemory(&d3dlight, sizeof( D3DLIGHT8 ) );
d3dlight.Type = D3DLIGHT_DIRECTIONAL ;
d3dlight.Direction = D3DXVECTOR3( 0.5f, 0.0f, -0.5f );
d3dlight.Diffuse = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );
d3dlight.Ambient = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );
D3dDevice->SetLight( 0, &d3dlight );
D3dDevice->LightEnable( 0, TRUE );
D3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

##### Share on other sites
By default the specular color of your vertex is used for ambient and specular lights, the diffuse vertex color for diffuse lights. If you want to use the color of the material instead call:

D3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
D3dDevice->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);

##### Share on other sites
Thanks a lot!! Now the light properties etc. seems to work quite fine but I still can''t understand why my normals dont seem to be needed. I can remove them and the lightning still works.

1. 1
2. 2
Rutin
19
3. 3
4. 4
khawk
15
5. 5

• 13
• 26
• 10
• 11
• 44
• ### Forum Statistics

• Total Topics
633743
• Total Posts
3013644
×