D3D11之缓存更新(update buffer)
来源:互联网 发布:浙江基层网络直报 编辑:程序博客网 时间:2024/06/07 14:58
话说这两天我写程序遇到一个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吧
0 0
- D3D11之缓存更新(update buffer)
- D3D11基础教程三之VertexShader,PixelShader,buffer
- D3D11教程二十五之DepthBuffer(深度缓存)
- D3D11基础教程一之D3D11框架
- D3D11基础教程二之D3D11初始化
- NIO缓存区(2)之Buffer
- Hibernate之update及更新部分字段
- linux之 更新update&upgrade&源
- D3D11教程六之AmbientLight
- D3D11教程三十二之MultipleLightShadowMapping
- update更新
- 缓存架构设计细节之“淘汰缓存”还是“更新缓存”
- 缓存溢出Buffer Overflow
- Buffer cache(缓冲区缓存)
- java 缓存Buffer学习
- nodeJS基础--缓存Buffer
- 高级OWI与ORACLE性能调整读书笔记之UPDATE/UPADTE引起的buffer busy wait
- HTTP学习之更新本地缓存
- Linux tcpdump命令详解
- [CUDA学习]2. CUDA C简介
- SSE练习:单精度浮点数组求和
- 在例12.3的基础上作以下修改,并作必要的讨论。
- MySQL取消用户权限
- D3D11之缓存更新(update buffer)
- 一句话概括下spring框架及spring cloud框架主要组件
- 扩展欧几里德模板及讲解
- IOS开发-此证书的签发者无效
- 函数的模板2——函数模板重载
- 数据表的横切与竖切(权限原因)
- SDUTACM 数据结构实验之栈二:一般算术表达式转换成后缀式
- 1532-Drainage Ditches
- Android多渠道打包(五):360多渠道打包+