Получить массив байтов из текстуры

Могу ли я получить массив байтов (ARGB) от D3D11Texture2D? В DirectX 11 нет функций GetSurfaceLevel и LockRect.


person gooseim    schedule 04.04.2013    source источник


Ответы (2)


Используйте функции Map / Unmap в вашем DeviceContext. Это будет работать только для типов текстур, поддерживающих чтение.

eg

D3D11_MAP eMapType = D3D11_MAP_READ;
D3D11_MAPPED_SUBRESOURCE mappedResource;

pDeviceContext->Map(m_pTexture, 0, eMapType, NULL, &mappedResource);

BYTE* pYourBytes = (BYTE*)mappedResource.pData;
unsigned int uiPitch = mappedResource.RowPitch;

// Do stuff here

pDevice->GetDeviceContext()->Unmap(m_pTexture, 0);

Если вы хотите прочитать содержимое текстуры рендеринга, вам нужно сначала создать промежуточную текстуру того же формата, что и ваша текстура рендеринга, а затем скопировать текстуру рендеринга в промежуточную текстуру с помощью DeviceContext-> CopyResource ().

person alanw    schedule 04.04.2013

Зачем вам нужно считывать данные текстуры? Вы храните данные в RAM, а затем загружаете их во VRAM. Он все еще должен быть в ОЗУ или на диске. Я что-то упускаю?

Вы можете посмотреть, как это было решено, в фреймбуфере DirectX 11 захват (C ++, без Win32 или D3DX)

person rioki    schedule 04.04.2013
comment
Возможно, текстура была создана шейдером - person jcoder; 04.04.2013
comment
У меня должны быть данные существующей текстуры в ОЗУ в формате ARGB. Спасибо, посмотрю ваш пример. - person gooseim; 04.04.2013
comment
Верно, потому что создание текстуры с помощью шейдера и ее считывание - очень эффективный способ сделать это. Если бы вы сказали, что он был создан через буфер кадра, тогда ... Хорошо, но в этом случае у вас будет доступ к нему через API буфера кадра. - person rioki; 04.04.2013
comment
Если я использую шейдеры, это не сработает. Могу ли я решить эту проблему? Где я могу найти пример API фреймбуфера? - person gooseim; 10.04.2013
comment
Эти вопросы и ответы могут помочь: http://stackoverflow.com/questions/120066/doing-readback-from-direct3d-textures-and-surfaces - person rioki; 10.04.2013
comment
Некоторые функции в этом примере объявлены устаревшими в DirectX 11. - person gooseim; 10.04.2013