Есть функция, которая создаёт несколько целей для рисования.
Код
void RenderTarget::InitialMultiRenderTarget(const bool withDepthBuffer,const RenderInitInfo* info)
{
HRESULT hr = S_OK;
bufferCount = info->_mrtCount;
renderTargetViewArray = new ID3D11RenderTargetView*[bufferCount];
renderTargetTextureArray = new ID3D11Texture2D*[bufferCount];
shaderResourceViewArray = new ID3D11ShaderResourceView*[bufferCount];
textureDesc.Width = info->_width;
textureDesc.Height = info->_height;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
textureDesc.SampleDesc.Count = info->_multisamples;
textureDesc.SampleDesc.Quality = info->_quality;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
textureDesc.CPUAccessFlags = 0;
textureDesc.MiscFlags = 0;
for (int i = 0; i<bufferCount; i++)
{
hr = render->GetDevice()->CreateTexture2D(&textureDesc, NULL, &renderTargetTextureArray[i]);
if (FAILED(hr))
{
ERROR("Код ошибки: # 0006");
}
}
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
renderTargetViewDesc.Format = textureDesc.Format;
renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
renderTargetViewDesc.Texture2D.MipSlice = 0;
// Create the render target views.
for (int i = 0; i<bufferCount; i++)
{
hr = render->GetDevice()->CreateRenderTargetView(renderTargetTextureArray[i], &renderTargetViewDesc, &renderTargetViewArray[i]);
if (FAILED(hr))
{
ERROR("Код ошибки: # 0006");
}
}
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
// Setup the description of the shader resource view.
shaderResourceViewDesc.Format = textureDesc.Format;
shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
shaderResourceViewDesc.Texture2D.MipLevels = 1;
// Create the shader resource views.
for (int i = 0; i<bufferCount; i++)
{
hr = render->GetDevice()->CreateShaderResourceView(renderTargetTextureArray[i], &shaderResourceViewDesc, &shaderResourceViewArray[i]);
if (FAILED(hr))
{
ERROR("Код ошибки: # 0006");
}
}
ID3D11Texture2D* pBackBuffer = NULL;
hr = render->GetSwapChain()->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
if (FAILED(hr)) ERROR("Код ошибки: # 0002");
D3D11_TEXTURE2D_DESC descDepth; // —труктура с параметрами
ZeroMemory(&descDepth, sizeof(descDepth));
pBackBuffer->GetDesc(&descDepth);
descDepth.MipLevels = 1; // уровень интерпол€ции
descDepth.ArraySize = 1;
descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; // формат (размер пиксел€)
descDepth.SampleDesc.Count = 1;
descDepth.SampleDesc.Quality = 0;
descDepth.Usage = D3D11_USAGE_DEFAULT;
descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; // вид - буфер глубин
descDepth.CPUAccessFlags = 0;
descDepth.MiscFlags = 0;
pBackBuffer->Release();
// при помощи заполненной структуры-описани€ создаем объект текстуры
hr = render->GetDevice()->CreateTexture2D(&descDepth, NULL, &depthStencilBuffer);
if (FAILED(hr)) ERROR("Код ошибки: # 0004");
D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; // —труктура с параметрами
ZeroMemory(&descDSV, sizeof(descDSV));
descDSV.Format = descDepth.Format; // формат как в текстуре
descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
descDSV.Texture2D.MipSlice = 0;
// ѕри помощи заполненной структуры-описани€ и текстуры создаем объект буфера глубин
hr = render->GetDevice()->CreateDepthStencilView(depthStencilBuffer, &descDSV, &depthStencilView);
if (FAILED(hr)) ERROR("Код ошибки: # 0005");
}
Каким образом можно обратиться к любой из них и записать/считать пиксель в координатах XY ?