所以我的问题是我有一个名为“ 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);
该代码几乎删除了除“ diffuse”以外的所有内容,因为我使用了“ D3D11_MAP_WRITE_DISCARD”。我尝试使用“ D3D11_MAP_WRITE”,所以其余的光缓冲不会弄乱,但是FAILED(result)返回为true,因此映射不起作用。我在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; }
那么,我需要做些什么才能能够修改缓冲区的元素而又不必再次重写整个东西呢?
最佳答案
如果我理解正确,我不确定。
您是否要使用一个缓冲区描述并在其中创建一些缓冲区?像那样:
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
bufferDesc.ByteWidth = sizeof(matrixBufferType);
// create matrixBuffer
result = device->CreateBuffer(&bufferDesc, NULL, &m_matrixBuffer);
if(FAILED(result)){ return false; }
// Change the description for the smoothing dynamic constant buffer.
bufferDesc.ByteWidth = sizeof(smoothingBufferType);
result = device->CreateBuffer(&bufferDesc, NULL, &m_smoothingBuffer);
if(FAILED(result)){ return false; }
// and so on
还是要将其他数据绑定到您的dataPtr2?喜欢:
result = deviceContext->Map(m_lightBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
if(FAILED(result)){ return false; }
dataPtr2= (lightBufferType*)mappedResource.pData;
dataPtr2->ambientColor = ambientColor;
dataPtr2->diffuseColor = diffuseColor;
dataPtr2->lightDirection = lightDirection;
lightDataPtr->padding = 0.0f;
deviceContext->Unmap(m_lightBuffer, 0);
dataPtr2的结构需要匹配16个字节,这可能会引起很多麻烦。因此是填充属性。
关于c++ - DirectX,C++中的映射缓冲区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20141222/