DirectX 10 메쉬 버퍼가 정렬되지 않은 문제? Wavefront OBJ 인덱스를 계산하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/968276

  •  13-09-2019
  •  | 
  •  

문제

Directx 10에서 Wavefront OBJ 모델을 렌더링하는 프로그램을 작성했습니다.

DESC 다음과 같이 정점 데이터를로드했습니다

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();

보시다시피, 나는 mpmesh에 대한 인덱스 버퍼를 설정하지 않았다. 정점 지수를 계산하는 방법을 모르겠습니다. 보시다시피, 내 정점 형식에는 정상이 포함되므로 동일한 정점 위치가 다른 정상을 가질 수 있습니다. 예를 들어, 큐브에는 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 

메쉬 인덱스 또는 기타 문제를 설정하지 않아 원인인지 확실하지 않습니다. 모든 의견을 환영합니다.

감사합니다.

도움이 되었습니까?

해결책

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

특정 오류는 ID3D10Device :: SetVertexBuffers () 호출에 지정된 내용에 기인합니다. 그것은 당신이 정점 사이의 보폭을 15 바이트로 설정했다고 주장합니다. 이는 4의 배수가 아니며 (사용중인 요소 형식에 요구됨) vertex 데이터의 크기도 아닙니다. 선언에서 정점 크기는 48 바이트입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top