使用摄像头的初始数据创建d3d11Texture2D

时间:2015-03-05 08:33:09

标签: 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 会出现内存错误。我尝试用虚拟数据填充数组以适应所有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);

1 个答案:

答案 0 :(得分:0)

Chuck Walbourn的评论让你99%的方式:没有三字节的DXGI像素格式,所以要正确打包从摄像机接收的数据,你必须创建一个与{{1格式化,并将您的相机数据复制到它,为每个像素0xFF添加第四个值(alpha值)。

但正如您所提到的,您的最后一行代码仍然失败。我相信这是因为您没有使用绑定标记DXGI_FORMAT_R8G8B8A8_UNORM以及d3dEyeTexture设置D3D11_BIND_RENDER_TARGET。但是,根据我的理解,如果你想让640x480的相机图像成为你的2364x1461渲染目标的背景,你需要重新采样数据以适应,这是一个痛苦的事情(并且缓慢)中央处理器。我的建议是用您的相机数据创建一个单独的D3D11_BIND_SHADER_RESOURCE标记的640x480纹理,并绘制它以填充整个屏幕作为绘制循环的第一步。这意味着创建一个单独的专用2364x1461渲染目标作为后台缓冲区,但这是设置Direct3D应用程序的常见第一步。