Создайте d3d11Texture2D с исходными данными с камеры

Я пытаюсь прочитать ввод с камеры и использовать его для создания фоновой поверхности в D3D11. Постоянно получаю ошибки памяти. Размер цели моего рендеринга: 2364 * 1461 Изображение, которое я получаю с камеры, представляет собой массив типа unsigned char

unsigned char* p = g_pOvrvision->GetCamImage(OVR::OV_CAMEYE_LEFT, (OVR::OvPSQuality)processer_quality);

Он возвращает 640 * 480 * 3 байт. Код, с которым я работаю, приведен ниже. CreateTexture2D выдает ошибку памяти. Я попытался заполнить массив фиктивными данными, чтобы вместить все 2364 * 1461. Это тоже не сработало. Не могли бы вы предложить мне решение?

D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(desc));
desc.Width = renderTargetSize.w;
desc.Height = renderTargetSize.h;
desc.MipLevels = desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.MiscFlags = 0;

ID3D11Texture2D *pTexture = NULL;

D3D11_SUBRESOURCE_DATA TexInitData;
ZeroMemory(&TexInitData, sizeof(D3D11_SUBRESOURCE_DATA));
TexInitData.pSysMem = texArray;
TexInitData.SysMemPitch = static_cast<UINT>(2364 * 3);
TexInitData.SysMemSlicePitch = static_cast<UINT>(3 * 2364 * 1461 * sizeof(unsigned char));

d3dDevice->CreateTexture2D(&desc, &TexInitData, &d3dEyeTexture);
d3dDevice->CreateShaderResourceView(d3dEyeTexture, nullptr, &d3dEyeTextureShaderResourceView);
d3dDevice->CreateRenderTargetView(d3dEyeTexture, nullptr, &d3dEyeTextureRenderTargetView);

person Inventor    schedule 05.03.2015    source источник
comment
Заставьте GetCamImage возвращать 2364*1461*3 байт, или заставьте CreateTexture2D ожидать 640*480*3 байт, или выполните какое-то промежуточное преобразование.   -  person user253751    schedule 05.03.2015
comment
Я преобразовал изображение с камеры в 2364x1461, как я уже упоминал. Что я сделал, так это: я попытался почувствовать недостающие значения с некоторым постоянным цветом просто для эксперимента. Тоже не работал   -  person Inventor    schedule 05.03.2015
comment
Поскольку ваш формат составляет 3 байта на пиксель (RGB 24bpp), вам нужно как-то его преобразовать, поскольку формата DXGI с 3 байтами на пиксель не существует. Что-то простое, например DXGI_FORMAT_R8G8B8A8_UNORM, которое вы должны создать как временный буфер 640 * 480 * 4, в который вы копируете исходные данные, устанавливая для альфа-канала (4-й байт) значение 0xff. Это также предполагает, что ваша камера возвращает RGB. Если это другое цветовое пространство (например, YUV), его необходимо преобразовать. См. DirectXTex для кода, обрабатывающего все преобразования различных форматов для наиболее общего случая.   -  person Chuck Walbourn    schedule 07.03.2015
comment
Я пробовал это. Затем d3dDevice->CreateRenderTargetView(d3dEyeTexture, nullptr, &d3dEyeTextureRenderTargetView); не может создать цель рендеринга. Он остается NULL.   -  person Inventor    schedule 07.03.2015


Ответы (1)


Комментарий Чака Уолборна дает вам 99% ответа: не существует трехбайтного формата пикселей DXGI, поэтому для правильной упаковки данных, которые вы получаете с камеры, вы должны создать новый буфер, который будет соответствовать формату DXGI_FORMAT_R8G8B8A8_UNORM, и скопировать ваш данные камеры, добавляя четвертое значение (альфа-значение) к каждому пикселю 0xFF.

Но, как вы упомянули, ваша последняя строка кода все еще терпит неудачу. Я полагаю, это потому, что вы не установили d3dEyeTexture с флагом привязки D3D11_BIND_RENDER_TARGET, а также D3D11_BIND_SHADER_RESOURCE. Однако из того, что я понимаю, если вы пытаетесь сделать изображение камеры 640x480 фоном цели рендеринга 2364x1461, вам нужно будет передискретизировать данные, чтобы они соответствовали, что очень сложно (и медленно) делать на ПРОЦЕССОР. Я бы порекомендовал создать отдельную текстуру 640x480 с пометкой D3D11_BIND_SHADER_RESOURCE с данными вашей камеры и нарисовать ее, чтобы заполнить весь экран, в качестве первого шага в цикле рисования. Это означает создание отдельной выделенной цели рендеринга 2364x1461 в качестве заднего буфера, но это обычный первый шаг в настройке приложения Direct3D.

person moneppo    schedule 02.04.2015