2009-06-09 1 views
0

은 내가 mpMesh에 대한 인덱스 버퍼를 설정하지 않은, 당신이 볼 수 있듯이 나는 DESC 다음DirectX 10 메쉬 버퍼가 정렬되지 않았습니다. 웨이브 프런트 obj 인덱스를 계산하는 방법?

D3D10_INPUT_ELEMENT_DESC defaultLayout[] = 
{ 
    {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT,  0, 0,        D3D10_INPUT_PER_VERTEX_DATA, 0}, 
    {"NORMAL",  0, DXGI_FORMAT_R32G32B32_FLOAT,  0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0}, 
    {"COLOR",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0}, 
    {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,  0, D3D10_APPEND_ALIGNED_ELEMENT, D3D10_INPUT_PER_VERTEX_DATA, 0}, 
}; 
r = D3DX10CreateMesh(Graphics()->GetDevice(),defaultLayout,4, 
         "POSITION",NumVerts(),12,D3DX10_MESH_32_BIT, 
         &mpMesh); 
    if(FAILED(r)) 
    { 
     throw cGameError(L"Can not create mesh"); 
    } 
    r= mpMesh->SetVertexData(0,&m_verts[0]); 
    if(FAILED(r)) 
    { 
     throw cGameError(L"Can not Set VertexData"); 
    } 
    //mpMesh->SetIndexData(&m_tris[0],m_tris.size()*3); 
    mpMesh->CommitToDevice(); 

로 정점 데이터를로드

다이렉트 X 10에서 파면 OBJ 모델을 렌더링하는 프로그램을 썼습니다. Vertexes 인덱스를 계산하는 방법을 모르겠습니다. 보시다시피, 내 버텍스 형식에는 노멀이 포함됩니다. 즉, 동일한 버텍스 위치가 다른 노멀을 가질 수 있습니다. 예를 들어, 큐브에는 36 개의 정점이 있지만 8 개의 다른 위치 만 포함됩니다. 파면 obj 파일은 8 위치 인덱스 만 사용합니다.

이 프로그램은 내가 그것을 메쉬 인덱스 또는 다른 문제를 설정하지 않음으로써 원인을인지 확실하지 않다 런타임

DrawIndexed: Vertex Buffer Stride (15) at the input vertex slot 0 is not aligned properly. The current Input Layout imposes an alignment of (4) because of the Formats used with this slot. 

EXECUTION ERROR #367: DEVICE_DRAW_VERTEX_STRIDE_UNALIGNED 

에서 다음과 같은 오류가 발생합니다. 모든 의견을 환영합니다.

감사합니다.

답변

2

OBJ 데이터를 네이티브 형식으로 사용할 수 없습니다. 일부 데이터는 언급 한대로 꼭지점간에 공유되기 때문입니다. D3D는 정점 당 하나의 인덱스 만 허용하며 정점 당 속성 당 하나의 인덱스는 허용하지 않습니다. 따라서 데이터를로드하는 동안 각 출력 정점에 대해 사용하는 모든 데이터를 복사해야합니다 (다른 옵션이 있지만 가장 간단합니다). 일단 이것을하면, 정점을 다시 사용하지 않으므로 인덱스 버퍼가 필요 없습니다. Draw() 만 사용하십시오.

특정 오류는 사용자가 표시하지 않은 ID3D10Device :: SetVertexBuffers() 호출에서 지정한 것 때문에 발생합니다. 정점 간 스트라이드를 15 바이트로 설정한다고 주장합니다. 이는 4의 배수가 아니며 (사용중인 요소 형식에서 필요함) 꼭지점 데이터의 크기가 아닙니다. 선언에서 정점 크기는 48 바이트입니다.

+0

대단히 감사합니다. Btw, 그 꼭지점을위한 메쉬를 만드는 데 어떤 이점이 있는지 알고 싶습니다. 같은 꼭지점 데이터로 여러 객체를 그리려 할 때 메쉬 사용 속도가 빠르다고 들었습니다. – LNK2019

+0

ID3DX10Mesh :: Optimize() 호출을 사용하면 크거나 복잡한 모델에서 성능을 크게 향상시킬 수 있습니다. 메시를 전처리로 최적화하지 않는 한 (아마도 OBJ를 읽는 중이 아닌 경우),이 호출만으로도 ID3DX10Mesh를 사용하는 것이 좋습니다. –

관련 문제