2012-06-13 3 views
0

다양한 잠재적 버텍스 형식에 적응해야하는 응용 프로그램을 작성 중입니다. 내가로드하고있는 메쉬에는 잠재적 인 버텍스 속성 (색상, 법선, 텍스처 코드, 가중치 등)이있을 수도 있고 없을 수도 있습니다.DirectX : Dynamic Vertex Declartion

선언의 간단한 예는 다음과 같다 :

D3DVERTEXELEMENT9 simple_decl[] = 
{ 
    {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, 
    {0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, 
    {0, 20, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, 
    {0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1}, 
    D3DDECL_END() 
}; 


struct MYVERTS 
{ 
    float x,y,z,u,v; 
    DWORD colr; 
    float nx,ny,nz; 
}; 

는 기본적 D3DVERTEXELEMENT9는 오프셋의 어레이이다. 각 오프셋은 "MYVERTS"데이터 멤버의 크기입니다.

사용자가 XYZ 좌표 및 색상으로 모델을 내 보내면 동적으로 3 개의 부동 소수점과 1 개의 DWORD를 가진 구조체를 생성 한 다음 오프셋 및 D3DDECLUSAGE가있는 선언을 생성하려고합니다.

실마리가 없습니다. 누구라도 조언을하나요?

답변

1

"동적으로 구조체를 생성 할 수 없지만"자신의 D3DVERTEXELEMENT9 배열을 채워서 시작할 수 있습니다. 간단한 방법은 사용중인 구성 요소와 유형에 대해 사용자 모델을 구문 분석하고 push_back()std::vector<D3DVERTEXELEMENT9>으로 파싱하는 것입니다.

모델에서 모든 구성 요소를 구문 분석 한 후에는 각 구성 요소 (예제의 두 번째 열)에 대한 오프셋을 계산할 수 있습니다. 마지막 구성 요소에서 다음 구성 요소의 시작점까지 또 다른 "오프셋"을 계산해야하며 이는 정점 보폭이됩니다. 귀하의 예제에서 36의 버텍스 보폭에 대해 D3DDECLTYPE_FLOAT3 또는 12의 크기를 더한 크기가 24입니다.

오프셋과 보폭이 있으면 사용자 모델의 정점 데이터를 올바른 바이트로 쓸 수 있습니다 정점 버퍼.

D3DDECL_END()을 입력 한 후에 vector의 내용을 D3D로 전달할 수도 있습니다.