D3D11之缓存更新(update buffer)

话说这两天我写程序遇到一个bug,是关于如何创建的ID3D11Buffer的应该以一种怎样的方式在每帧渲染进行缓存资源的更新


我总结为下:


第一,当buffer是CPU访问写并且是动态的时候

//填充(顶点)缓存形容结构体和子资源数据结构体,并创建顶点缓存(这里用的是动态缓存)
	D3D11_BUFFER_DESC vertexBufferDesc;
	vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
	vertexBufferDesc.ByteWidth = sizeof(Vertex) * mVertexCount;
	vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
	vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	vertexBufferDesc.MiscFlags = 0;
	vertexBufferDesc.StructureByteStride = 0;

这里此时每帧进行该缓存资源的更新应该用MAP和UMAP进行资源更新
vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;



//锁定顶点缓存为了可以进行写入(动态缓存不能用UpdateSubResources写入)
	D3D11_MAPPED_SUBRESOURCE mappedResource;
	HR(d3dDeviceContext->Map(md3dVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource));

	//获取指向顶点缓存的指针
	Vertex* verticesPtr;
	verticesPtr = (Vertex*)mappedResource.pData;

	//把数据复制进顶点缓存
	memcpy(verticesPtr, (void*)vertexs, (sizeof(Vertex) * mVertexCount));

	//解锁顶点缓存
	d3dDeviceContext->Unmap(md3dVertexBuffer, 0);





第二,当buffer不是CPU访问写并且是默认的时候,用updatesubResouce

//,设置(常量)缓存形容结构体,并创建常量缓存
	D3D11_BUFFER_DESC matrixBufferDesc;
	ZeroMemory(&matrixBufferDesc, sizeof(matrixBufferDesc));
	matrixBufferDesc.Usage =D3D11_USAGE_DEFAULT;  //缓存
        matrixBufferDesc.ByteWidth = sizeof(CBMatrix);   //结构体大小,必须为16字节倍数
        matrixBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
        matrixBufferDesc.CPUAccessFlags = 0;  //CPU访问写
        matrixBufferDesc.MiscFlags = 0;
       matrixBufferDesc.StructureByteStride = 0;
       HR(d3dDevice->CreateBuffer(&matrixBufferDesc, NULL, &mCBMatrixBuffer));

      这里 matrixBufferDesc.Usage =D3D11_USAGE_DEFAULT;  //缓存
           matrixBufferDesc.CPUAccessFlags = 0;  //CPU访问写

CBMatrix cb;
XMMATRIX worldMa = XMMatrixTranspose(worldMatrix);
XMMATRIX viewMa = XMMatrixTranspose(viewMatrix);
XMMATRIX ProjMa = XMMatrixTranspose(ProjMatrix);
cb.mWorldMatrix = worldMa;
cb.mViewMatrix = viewMa;
cb.mProjMatrix = ProjMa;
d3dDeviceContext->UpdateSubresource(mCBMatrixBuffer, 0, NULL, &cb, 0, 0);
//上面创建Buffer设置的标志位不一样,更新资源的方式也不一样,如果不按指定方式更新资源将会造成资源无法写入缓存的后果
更具体的等我水平提高研究过在补充后续内容,更新每帧动态变化的尽量还是用MAP和UMAP吧

 
 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值