2017-03-14 9 views
0

assimp를 사용하여 3D 모델을로드하는 소형 프로그램을 개발 중이지만 모델을 렌더링하지는 않습니다. 처음에는 정점과 인덱스가 올바르게로드되지 않았다고 생각했지만, 그렇지 않았습니다 (꼭 txt 파일의 정점과 인덱스에 인쇄했습니다). 나는 그 모형이 카메라와 카메라의 위치에 있다고 생각한다. 응용 프로그램이 오류를 반환하지 않으면 올바르게 실행됩니다.3d 모델이 렌더링되지 않음 (DirectX 12)

정점 구조체 :

struct Vertex { 
    XMFLOAT3 position; 
    XMFLOAT2 texture; 
    XMFLOAT3 normal; 
}; 

입력 레이아웃 :

D3D12_INPUT_ELEMENT_DESC inputLayout[] = 
    { 
     { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, 
     { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, 
     { "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 } 
    }; 

정점 texcoords, 법선과와 indices 로더 :

: 카메라 뷰

model = new ModelMesh(); 
    std::vector<XMFLOAT3> positions; 
    std::vector<XMFLOAT3> normals; 
    std::vector<XMFLOAT2> texCoords; 
    std::vector<unsigned int> indices; 
    model->LoadMesh("beast.x", positions, normals, 
     texCoords, indices); 
    // Create vertex buffer 

    if (positions.size() == 0) 
    { 
     MessageBox(0, L"Vertices vector is empty.", 
      L"Error", MB_OK); 
    } 
    Vertex* vList = new Vertex[positions.size()]; 
    for (size_t i = 0; i < positions.size(); i++) 
    { 
     Vertex vert; 
     XMFLOAT3 pos = positions[i]; 
     vert.position = XMFLOAT3(pos.x, pos.y, pos.z); 
     XMFLOAT3 norm = normals[i]; 
     vert.normal = XMFLOAT3(norm.x, norm.y, norm.z); 
     XMFLOAT2 tex = texCoords[i]; 
     vert.texture = XMFLOAT2(tex.x, tex.y); 
     vList[i] = vert; 
    } 

    int vBufferSize = sizeof(vList); 

빌드

XMMATRIX tmpMat = XMMatrixPerspectiveFovLH(45.0f*(3.14f/180.0f), (float)Width/(float)Height, 0.1f, 1000.0f); 
    XMStoreFloat4x4(&cameraProjMat, tmpMat); 

    // set starting camera state 
    cameraPosition = XMFLOAT4(0.0f, 2.0f, -4.0f, 0.0f); 
    cameraTarget = XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f); 
    cameraUp = XMFLOAT4(0.0f, 1.0f, 0.0f, 0.0f); 

    // build view matrix 
    XMVECTOR cPos = XMLoadFloat4(&cameraPosition); 
    XMVECTOR cTarg = XMLoadFloat4(&cameraTarget); 
    XMVECTOR cUp = XMLoadFloat4(&cameraUp); 
    tmpMat = XMMatrixLookAtLH(cPos, cTarg, cUp); 
    XMStoreFloat4x4(&cameraViewMat, tmpMat); 


    cube1Position = XMFLOAT4(0.0f, 0.0f, 0.0f, 0.0f); 
    XMVECTOR posVec = XMLoadFloat4(&cube1Position); 

    tmpMat = XMMatrixTranslationFromVector(posVec); 
    XMStoreFloat4x4(&cube1RotMat, XMMatrixIdentity()); 
    XMStoreFloat4x4(&cube1WorldMat, tmpMat); 
,

업데이트 기능 :

XMStoreFloat4x4(&cube1WorldMat, worldMat); 


    XMMATRIX viewMat = XMLoadFloat4x4(&cameraViewMat); // load view matrix 
    XMMATRIX projMat = XMLoadFloat4x4(&cameraProjMat); // load projection matrix 
    XMMATRIX wvpMat = XMLoadFloat4x4(&cube1WorldMat) * viewMat * projMat; // create wvp matrix 
    XMMATRIX transposed = XMMatrixTranspose(wvpMat); // must transpose wvp matrix for the gpu 
    XMStoreFloat4x4(&cbPerObject.wvpMat, transposed); // store transposed wvp matrix in constant buffer 

    memcpy(cbvGPUAddress[frameIndex], &cbPerObject, sizeof(cbPerObject)); 

버텍스 쉐이더 :

struct VS_INPUT 
{ 
    float4 pos : POSITION; 
    float2 tex: TEXCOORD; 
    float3 normal : NORMAL; 
}; 

struct VS_OUTPUT 
{ 
    float4 pos: SV_POSITION; 
    float2 tex: TEXCOORD; 
    float3 normal: NORMAL; 
}; 

cbuffer ConstantBuffer : register(b0) 
{ 
    float4x4 wvpMat; 
}; 

VS_OUTPUT main(VS_INPUT input) 
{ 
    VS_OUTPUT output; 
    output.pos = mul(input.pos, wvpMat); 
    return output; 
} 

그것을 읽을 수있는 긴 코드입니다 희망하지만이 코드로 잘못 무슨 일이 일어나고 있는지 이해가 안 돼요. 누군가가 나를 도울 수 있기를 바랍니다.

답변

0

시도하는 몇 가지/확인 :

  • 이 배경 투명 색상 회색을합니다. 그렇게하면 검은 삼각형을 그려 볼 수 있습니다.
  • 트라이앵글이 맨 뒤로 향하는 경우 렌더링 상태에서 뒷면을 컬링 해제합니다.
  • 렌더링 상태에서 깊이 테스트를 해제하십시오.
  • 알파 블렌딩을 해제하십시오.
  • 픽셀 쉐이더를 표시하지 않지만 불투명 한 색상을 작성하여 조명 계산이 잘못되었는지보십시오.
  • NVIDIA의 nSight 도구 또는 Visual Studio 그래픽 디버거를 사용하여 그래픽 파이프 라인의 기능을 확인하십시오.

일반적으로 처음 시도하는 사항입니다 ...