2016-06-10 103 views
1

我有很多樹通過在我的地形生成應用程序內使用實例呈現。我將一個實例列表與我的相機視錐體進行比較,以測試它們是否可見。如果它們可見,則將它們推送到實例向量。每一幀,如果有樹可見,我更新樹實例緩衝區。這工作非常好,每幀渲染樹沒有任何問題,但是,我重新創建實例緩衝區每幀,而不是更新它。DirectX11更新動態實例緩衝區

我最近改變了更新功能,我認爲反而會更新緩衝區:

void CModel::UpdateInstances(const std::vector<SInstance>& instances, ID3D11DeviceContext* context) 
{ 
    D3D11_MAPPED_SUBRESOURCE resource; 
    ZeroMemory(&resource, sizeof(resource)); 

    mInstanceCount = instances.size(); 
    size_t copySize = sizeof(SInstance) * mInstanceCount; 

    context->Map(mIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);  
    memcpy(resource.pData, &instances[0], copySize); 
    context->Unmap(mIB, 0); 
} 

的問題是,樹木的arent正確呈現,因爲有很多閃爍(其中我做不到真正捕捉得非常好),我只能形容爲樹木到處瞬移:

enter image description here

緩衝區是否正確設置了「D3D11_USAGE_DYNAMIC」使用標誌和「D3D11_CPU_ACCESS_WRITE」訪問佛羅里達州股份公司。

立即明白我做錯了什麼?作爲參考,這是緩衝是如何重建以前

void CModel::UpdateInstances(const std::vector<SInstance>& instances, ID3D11Device* device) 
{ 
    mInstanceCount = instances.size(); 

    if (mIB) 
     SafeRelease(mIB); 

    D3D11_BUFFER_DESC ibd; 
    ibd.Usage = D3D11_USAGE_DYNAMIC; 
    ibd.ByteWidth = sizeof(SInstance) * mInstanceCount; 
    ibd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    ibd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
    ibd.MiscFlags = 0; 
    ibd.StructureByteStride = 0; 

    D3D11_SUBRESOURCE_DATA isr; 
    isr.pSysMem = &instances[0]; 
    isr.SysMemPitch = 0; 
    isr.SysMemSlicePitch = 0; 

    DXHRes(device->CreateBuffer(&ibd, &isr, &mIB)); 
} 
+0

''Map''返回一個你沒有檢查的HRESULT。你需要用''SUCCEEDED'',''FAILED''或[ThrowIfFiled](https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFiled)來檢查所有的HRESULT失敗。 –

+0

謝謝,沒有看到。此外,它正在返回S_OK。 – Daniel

+0

您是否使用您現在具有的最大實例數創建實例緩衝區,您只更新它或使用第一次選擇的大小結果? – galop1n

回答

0

正如@ galop1n指出,這個問題是由於這樣的事實,我沒有創造與人的實例的最大數量的實例緩衝可能。

爲了解決這個問題,我簡單地創建了這個緩衝區。

D3D11_BUFFER_DESC ibd; 
ibd.Usage = D3D11_USAGE_DYNAMIC; 
ibd.ByteWidth = sizeof(SInstance) * maxInstances; 
ibd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
ibd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; 
ibd.MiscFlags = 0; 
ibd.StructureByteStride = 0; 

D3D11_SUBRESOURCE_DATA isr; 
isr.pSysMem = &instances[0]; 
isr.SysMemPitch = 0; 
isr.SysMemSlicePitch = 0; 

DXHRes(device->CreateBuffer(&ibd, &isr, &mIB));