Поэтому моя проблема в том, что у меня есть буфер, называемый «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 (результат) вернул как 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 байтам, что может вызвать много проблем. поэтому атрибут отступа.
Других решений пока нет …