C++ 使用相机的初始数据创建d3d11Texture2D

C++ 使用相机的初始数据创建d3d11Texture2D,c++,graphics,directx-11,direct3d11,C++,Graphics,Directx 11,Direct3d11,我试图从相机读取输入,并使用它在D3D11中创建背景曲面。我一直收到内存错误。 我的渲染目标大小为:2364*1461 我从相机得到的图像是一个类型为unsigned char的数组 unsigned char* p = g_pOvrvision->GetCamImage(OVR::OV_CAMEYE_LEFT, (OVR::OvPSQuality)processer_quality); 它返回640*480*3字节。下面是我正在使用的代码。CreateTexture2D出现内存错误。我

我试图从相机读取输入,并使用它在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);

Chuck Walbourn的评论可以让你达到99%的效果:没有三字节的DXGI像素格式,所以要正确打包从相机接收的数据,你必须创建一个新的缓冲区,与DXGI_格式_R8G8B8A8_UNORM格式相匹配,并将相机数据复制到其中,为0xFF的每个像素添加第四个值,即alpha值


但正如您所提到的,您的最后一行代码仍然失败。我相信这是因为您没有使用绑定标志D3D11_bind_RENDER_TARGET以及D3D11_bind_SHADER_资源设置d3dEyeTexture。然而,据我所知,如果您试图将640x480的相机图像作为2364x1461渲染目标的背景,则需要重新采样数据以适应需要,这是一件很麻烦的事情,而且CPU速度较慢。我的建议是使用相机数据创建一个单独的、带有D3D11_BIND_SHADER_资源标记的640x480纹理,并绘制它以填充整个屏幕,作为绘制循环的第一步。这意味着创建一个单独的、专用的2364x1461渲染目标作为您的后台缓冲区,但这是设置Direct3D应用程序的常见第一步。

使GetCamImage返回2364*1461*3字节,或使CreateTexture2D期望640*480*3字节,或在两者之间进行某种转换。正如我提到的,我将图像从相机转换为2364x1461。我所做的是:为了一个实验,我试着用一些恒定的颜色来感觉缺失的值。因为你的格式是每像素3字节RGB 24bpp,你必须以某种方式转换它,因为没有每像素3字节DXGI格式。简单的DXGI_FORMAT_R8G8B8A8_UNORM,您必须创建一个640*480*4临时缓冲区,将原始数据复制到alpha通道中,将第4个字节设置为0xff。这还假设您的相机返回RGB。如果它是一个不同的颜色空间,如YUV,你必须转换它。请参阅,以获取处理最一般情况下的所有各种格式转换的代码。我已经尝试过了。然后,d3dDevice->CreateRenderTargetViewd3dEyeTexture、nullptr和D3DeyeTextureEnderTargetView;无法创建渲染目标。它保持为空。