所以我的问题是我有一个叫做“lightbuffer”的缓冲区,里面有一堆东西,我希望能够修改它的一个或多个元素,而不必再次重写整个东西。具体来说,如果我这样做:
result = devicecontext->Map(lightbuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if(FAILED(result)) { die("map lightbuffer"); }
dataPtr2 = (dxapp::LightBufferType*)mappedResource.pData;
dataPtr2->diffuse = diffuse;
devicecontext->Unmap(lightbuffer, 0);
这段代码几乎删除了除“漫反射”之外的所有内容,因为我使用了“D3D11_MAP_WRITE_DISCARD”。我尝试使用“D3D11_MAP_WRITE”,所以光缓冲区的其余部分不会搞砸,但 FAILED(result) 返回为真,所以映射不起作用。我在 MSDN 上读到,如果我想这样做,我需要在缓冲区描述中使用“D3D11_CPU_ACCESS_WRITE”,但是我这样做了,我的缓冲区描述如下:
lightBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
lightBufferDesc.ByteWidth = sizeof(LightBufferType);
lightBufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
lightBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
lightBufferDesc.MiscFlags = 0;
lightBufferDesc.StructureByteStride = 0;
result = mydevice->CreateBuffer(&lightBufferDesc, NULL, &mylightbuffer);
if(FAILED(result)) { return false; }
那么我需要做什么才能修改缓冲区的元素而无需再次重写整个内容?