2017-03-14 23 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、法線及びインデックスローダ:

:カメラビューの

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グラフィックスデバッガを使用して、グラフィックスパイプラインが何をしているかを確認します。

これは通常私が最初に試したことです...

関連する問題