2017-03-14 2 views
0

Ich entwickle ein kleines Programm, das 3D-Modelle mit Assimp laden, aber es das Modell nicht wiedergeben. Zuerst dachte ich, dass Scheitelpunkte und Indizes nicht korrekt geladen wurden, aber das ist nicht der Fall (ich habe auf Scheitelpunkte und Indizes einer txt-Datei gedruckt). Ich denke, dass das Problem mit der Position des Modells und der Kamera sein könnte. Die Anwendung gibt keinen Fehler zurück, sie wird ordnungsgemäß ausgeführt.3D-Modell nicht gerendert (DirectX 12)

Vertex Struct:

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

Eingang Layout:

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 } 
    }; 

Vertices, texcoords, Normale und Indizes loader:

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

Erstellen der Kamera und Ansichten:

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

Update-Funktion:

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

VERTEX SHADER:

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; 
} 

Hoffe, dass es ein Code mit diesem Code lang zu lesen, aber ich verstehe nicht, was falsch läuft. Hoffe jemand kann mir helfen.

Antwort

0

Ein paar Dinge zu versuchen/Check:

  • Ihre klare Farbe grau hintergrund. Wenn du schwarze Dreiecke zeichnest, siehst du sie.
  • Deaktivieren Sie die Rückseitenausblendung im Rendering-Status, für den Fall, dass Ihre Dreiecke wieder nach vorne zeigen.
  • Tiefenprüfung im Rendering-Zustand ausschalten.
  • Alpha-Blending deaktivieren.
  • Sie zeigen Ihren Pixelshader nicht an, aber versuchen Sie, eine konstante Farbe zu schreiben, um zu sehen, ob Ihre Beleuchtungsberechnung unterbrochen ist.
  • Verwenden Sie NVIDIAs nSight-Tool oder den Visual Studio Graphics-Debugger, um zu sehen, was Ihre Grafik-Pipeline macht.

Das sind normalerweise die Dinge, die ich zuerst versuche ...