Jump to content
  • Advertisement
Sign in to follow this  
bengaltgrs

Finding Normals

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

Basically I have verticies and texture coordinates, but I need to find the normals. This is what I have so far:
IDirect3DIndexBuffer9*  IB;
IDirect3DVertexBuffer9* VertexVB;
IDirect3DVertexBuffer9* NormalsVB;
IDirect3DVertexBuffer9* TextureVB;
IDirect3DVertexDeclaration9* Decl;

D3DVERTEXELEMENT9 ModelEl[] =
{
	{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
	{1, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
	{2, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
	D3DDECL_END();)
};
D3DDevice->CreateVertexDeclaration( ModelEl, &Decl );

//Render
D3DDevice->SetVertexDeclaration(Decl);

D3DDevice->SetIndices(IB);
D3DDevice->SetStreamSource(0,VertexVB,0,sizeof(POSITION_VERTEX));
D3DDevice->SetStreamSource(1,NormalsVB,0,sizeof(POSITION_VERTEX));
D3DDevice->SetStreamSource(2,TextureVB,0,sizeof(TEXTURE_VERTEX));

D3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, NumVert, 0, NumTri);


The texture buffer and vertex buffer get filled earlier, but I was wondering if there was a way to compute the normals and have them stored into the normals buffer. Thanks, -Chris

Share this post


Link to post
Share on other sites
Advertisement
you could use the ID3DXMesh interface. Just load the vertex and indexbuffer into a mesh object, then use the function D3DXComputeNormals to have D3DX compute the normals for you.

//emil

Share this post


Link to post
Share on other sites
That is what I was originally thinking of doing, but I cannot seem to implement it. Could anyone post a way to get the normals and put them into a seperate vertex buffer?

Thanks,
-Chris

Share this post


Link to post
Share on other sites
Computing the normals yourself is not too difficult. The easiest way to do it is to just compute the normals of each face. So you would lock your vertex and index buffers and for each triangle, compute the vector that is perpendicular to that face. To do that, you would perform the cross prodcut between two edges of the triangle.

A second, more accurate procedure to compute the normal vectors of a mesh would be to take into account the adjacency information of the mesh. So the normal at every vertex would be the average of all the normals of each face that connects to this vertex. This would give the normals of each vertex a smoother shape. To do this, you need to be able to figure out which faces are adjacent to eachother or which triangles share a particular vertex.

If you want to see how to create an object of the ID3DXMesh interface to do some of this for you, take a look at the MeshFromOBJ sample. That sample builds an object of ID3DXMesh by loading the data from another file type. Once you've got that object created, you can copy its vertex data wherever you need it.

neneboricua

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!