• Advertisement
Sign in to follow this  

SDKMesh Vertex format + DirectX 11 mesh load and animator

This topic is 2036 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

Hi folks,
I've been looking for a quick and easy way to load in a model of a person and animate them for a simulator I'm working on.

Oh before I forget, I'm using DirectX 11.

I've been looking at the SDKMesh class in DXUT as it seems the fastest simplest way for me to achieve this, but I'm a little confused over the vertex format stuff.
I've looked at a few different examples using the class and each has a different, seemingly global, vertex format, but they all use the SDKMesh class. E.g. the old multi-animation example only has position and texture coordinates, but in the DXUT tutorials they add the normals as well. I'm new to dealing with meshes loaded from file in DirectX, I'm usually hard coding spheres for examples :P

Does the SDKMesh class deal with the vertex format separately - or is it that the vertex format is embedded in the .sdkmesh file, and you have to mirror it in the code??

I notice that the intel multi animation example using threaded building blocks includes some animation data as part of their vertex format and yet in the folder structure I can see an sdkmesh file - presumably the actual mesh - and an sdkmesh_anim file - which I assume is the animation data. I'm just wandering how they all deal with this....

This isn't something I'm interested in programming at the moment, nor do I have the time - my uni deadline is fast approaching :s
Basically I need a way to call load on something to get a mesh and call animate on it to make it move :P and then I'll move the object around the world as it animates. Lazy I know, but animation is not the theme of my project but I'd like it in there for completeness and an added facet of realism.

Sorry its a bit disjoint - I'm not really sure how to ask what I need :s
Hopefully you'll understand
Thanks very much!!

Share this post


Link to post
Share on other sites
Advertisement
I am setting the vertex format explicitely before callind the rendering function of SDKMesh
and everything works fine.

Share this post


Link to post
Share on other sites

Does the SDKMesh class deal with the vertex format separately - or is it that the vertex format is embedded in the .sdkmesh file, and you have to mirror it in the code??


This is probably way too late for your uni project... but yes. You need to mirror the vertex buffer format in code.

If you use the ContentExporter tool (source available in the June 2010 SDK), you can run it with a logging level that outputs the vertex format when it creates your sdkmesh:

ContentExporter.exe MyModel.FBX -loglevel 4

This will give you some very useful output, such as:

Triangle list mesh: 51 verts, 270 indices, 1 subsets
D3DX mesh operations increased vertex count from 51 to 53.
Vertex size: 36 bytes; VB size: 1908 bytes
Element 0 Stream 0 Offset 0: Position.0 Type Float3 (12 bytes)
Element 1 Stream 0 Offset 12: BlendWeight.0 Type UByte4N (4 bytes)
Element 2 Stream 0 Offset 16: BlendIndices.0 Type UByte (4 bytes)
Element 3 Stream 0 Offset 20: Normal.0 Type Dec3N (4 bytes)
Element 4 Stream 0 Offset 24: TexCoord.0 Type Float16_2 (4 bytes)
Element 5 Stream 0 Offset 28: Tangent.0 Type Dec3N (4 bytes)
Element 6 Stream 0 Offset 32: Binormal.0 Type Dec3N (4 bytes)


Which you can use to create your vertex layout in code:

// Create our vertex input layout
const D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "WEIGHTS", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "BONES", 0, DXGI_FORMAT_R8G8B8A8_UINT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TEXCOORD", 0, DXGI_FORMAT_R16G16_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "TANGENT", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "BINORMAL", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};


And of course you'll need to match that in your vertex shader, too:

struct VSSkinnedSceneIn
{
float3 Pos : POSITION; //Position
float4 Weights : WEIGHTS; //Bone weights
uint4 Bones : BONES; //Bone indices
float3 Normal : NORMAL; //Normal
float2 Tex : TEXCOORD; //Texture coordinate
float3 Tan : TANGENT; //Normalized Tangent vector
float3 Binormal : BINORMAL; //Binormal
};


Hope this helps someone!

Share this post


Link to post
Share on other sites
in this tutorial , D3D11_MD5_Animation how do you make the model change animation tracks?

Share this post


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

  • Advertisement