Jump to content

  • Log In with Google      Sign In   
  • Create Account

daddis

Member Since 20 Sep 2012
Offline Last Active Sep 24 2012 04:10 AM

Posts I've Made

In Topic: SDKMesh Vertex format + DirectX 11 mesh load and animator

20 September 2012 - 07:53 AM

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!

PARTNERS