[序言 我将尝试将IDS uEye Cameras中的视频流渲染到DirectX场景。相机的色彩模式当前设置为 IS_CM_RGBA8_PACKED 。现在,我只是从凸轮捕获一个图片,将其冻结到char * cameraBufferLeft_并尝试将其用作ShaderResourceView(它应该替换之前使用的.dds文件)。
以前,我在CreateTexture2D功能上遇到了问题,因为相机模式设置为 IS_CM_RGB8_PACKED ,这意味着那里没有Alpha通道。当然,这不适用于DirectX和CreateTexture2D的 D3D11_TEXTURE2D_DESC.FORMAT = DXGI_FORMAT_R8G8B8A8_UNORM 崩溃。
[当前状态] 现在,现在创建ID3D11Texture2D对象,但是当我想创建ShaderResourceView时它失败了。我无法弄清楚为什么以及问题是什么。
所以我研究了,并使用Debug-Flag创建了我的DirectX RenderDevice,但我只是获得了“info”输出,没有具体关于失败的东西......
我希望有人可以帮助我,我现在迷失了。
[相关代码]
D3D11_TEXTURE2D_DESC tdesc;
ZeroMemory(&tdesc, sizeof(tdesc));
D3D11_SUBRESOURCE_DATA srInitData;
ZeroMemory(&srInitData, sizeof(srInitData));
ID3D11Texture2D* tex = 0;
// NOTE: Just for dirty Synchronisation. If Camera Stream works, doing better solution for this..
// TODO: implement Camera and Graphics Synchronisation - using Condition Variables | WakeConditionVariable()
Sleep(1500);
tdesc.ArraySize = 1;
tdesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
tdesc.Usage = D3D11_USAGE_DYNAMIC;
tdesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
tdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
tdesc.Height = CAMERA_HEIGHT;
tdesc.Width = CAMERA_WIDTH;
tdesc.MipLevels = 1;
tdesc.MiscFlags = 0;
tdesc.SampleDesc.Count = 1;
tdesc.SampleDesc.Quality = 0;
// NOTE: "cameraBufferLeft_" contains RGBA8 Data. ColorMode of Camera set to IS_CM_RGBA8_PACKED
srInitData.pSysMem = arift_control->cameraBufferLeft_;
srInitData.SysMemPitch = CAMERA_WIDTH * 4;
// works
if (device->CreateTexture2D(&tdesc, &srInitData, NULL) == S_FALSE)
std::cout << "Inputs correct" << std::endl;
else
std::cout << "wrong inputs" << std::endl;
if (FAILED(device->CreateTexture2D(&tdesc, &srInitData, &tex)))
{
std::cout << "Failed" << std::endl;
return(false);
}
else
std::cout << "Sucess" << std::endl;
// Create the shader-resource view
D3D11_SHADER_RESOURCE_VIEW_DESC srDesc;
srDesc.Format = tdesc.Format;
srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
// srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srDesc.Texture2D.MostDetailedMip = 0;
srDesc.Texture2D.MipLevels = 1;
// this crashes with access violation
if (FAILED(device->CreateShaderResourceView(tex, &srDesc, &texture_)));
{
std::cerr << "Can't create Shader Resource View" << std::endl;
return false;
}
return true;
[相关输出] ... D3D11 INFO:创建ID3D11Texture2D:Name =“unnamed”,Addr = 0x00E0A6B4,ExtRef = 1,IntRef = 0 [STATE_CREATION INFO#2097234:CREATE_TEXTURE2D] D3D11 INFO:创建ID3D11ShaderResourceView:Name =“unnamed”,Addr = 0x00E0AC9C,ExtRef = 1,IntRef = 0 [STATE_CREATION INFO#2097240:CREATE_SHADERRESOURCEVIEW]
此外,我还尝试使用NULL作为第二个参数创建ShaderResourceView - 仍然失败。我被困在这里已经有一段时间了。非常感谢您的帮助! :)
[更新1] 所以,现在我尝试使用 CreateDDSTextureFromMemory 和 CreateWICTextureFromMemory (加载一个.png工作,但这不是我的目标) - 两者都失败了,因为它既不是.jpg / .png也不是.dds文件。它只是一个包含RGBA8数据的char *缓冲区。我现在尝试了很多不同的方法,现在我真的不知道还有什么可以做的。