2013-11-22 3 views
1

Так что моя проблема в том, что у меня есть буфер, называемый «lightbuffer», в котором есть куча вещей, и я хочу иметь возможность модифицировать один или несколько его элементов, не имея переписать все это снова. В частности, если я:Сопоставление буферов в DirectX, C++

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», так что остальная часть lightbuffer не была бы испорчена, но 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; } 

Так что мне нужно сделать, чтобы быть способный модифицировать элементы буфера, не переписывая все это снова?

+0

Включите [уровень отладки DirectX] (http://msdn.microsoft.com/en-us/library/windows/desktop/jj200584%28v=vs.85%29.aspx) и опубликуйте сообщения с его вывода. – Drop

ответ

0

Я не совсем уверен, если я правильно понял. Вы хотите использовать одно описание буфера и создать некоторые буферы из этого? Например:

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); 

Структура данныхPtr2 должна соответствовать 16 байтам, что может вызвать массу проблем. поэтому является атрибутом padding.

+1

На самом деле, я просто хочу иметь возможность использовать D3D11_MAP_WRITE, а не D3D11_MAP_WRITE_DISCARD, но по какой-то причине он не работает – CivDav

+0

ja, если я trie MAP_WRITE, он не работает, а также ... и я также добавляю cpuAccess в D3D11_CPU_ACCESS_WRITE. .. он работает с D3D11_MAP_WRITE_DISCARD? есть ли какие-либо причины для перехода с WRITE_DISCARD на WRITE? – Jinxi