我正在尝试读取相机的输入,并使用它在D3D11中创建背景曲面。我总是收到记忆错误。我的渲染目标大小为:2364*1461我从相机上得到的图像是一个类型为无符号字符的数组
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_FORMAT_R8G8B8A8_UNORM
格式匹配的新缓冲区,并将相机数据复制到其中,为0xFF的每个像素添加第四个值(一个阿尔法值)。
但正如您所提到的,您的最后一行代码仍然失败。我相信这是因为您没有使用绑定标志D3D11_BIND_RENDER_TARGET
和D3D11_BIND_SHADER_RESOURCE
设置d3dEyeTexture
。然而,据我所知,如果你想让640x480的相机图像成为2364x1461渲染目标的背景,你需要对数据进行重新采样以适应,这在CPU上很难做到(而且速度很慢)。我的建议是用你的相机数据创建一个单独的、带有D3D11_BIND_SHADER_RESOURCE
标记的640x480纹理,并绘制它以填充整个屏幕,作为绘制循环的第一步。这意味着创建一个单独的专用2364x1461渲染目标作为后台缓冲区,但这是设置Direct3D应用程序的常见第一步。