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正確呈現,因爲有很多閃爍(其中我做不到真正捕捉得非常好),我只能形容爲樹木到處瞬移:
緩衝區是否正確設置了「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));
}
''Map''返回一個你沒有檢查的HRESULT。你需要用''SUCCEEDED'',''FAILED''或[ThrowIfFiled](https://github.com/Microsoft/DirectXTK/wiki/ThrowIfFiled)來檢查所有的HRESULT失敗。 –
謝謝,沒有看到。此外,它正在返回S_OK。 – Daniel
您是否使用您現在具有的最大實例數創建實例緩衝區,您只更新它或使用第一次選擇的大小結果? – galop1n