我将尝试将opencv :: Mat中的2D纹理渲染到DX11中的纹理以及阴影资源中。问题是,程序在 Device :: CreateTexture2D()上崩溃,我无法弄清楚原因。我研究了一整天,我不知道这里有什么不对。
此外,问题似乎不是cv :: Mat作为资源,因为我在这里也试过这个例子:D3D11 CreateTexture2D in 32 bit format,象棋示例作为纹理的资源......而且函数仍然用第3个参数调用时崩溃。
我找到了其他人,他们遇到了这个功能的问题,有时问题是因为SysMemPitch没有为2D纹理设置,但不幸的是,情况并非如此。
错误输出:ARift.exe中0x692EF11E(igd10iumd32.dll)的第一次机会异常:0xC0000005:访问冲突读取位置0x03438000。
这是相关代码:
bool Texture::InitCameraStream(ID3D11Device* device, ARiftControl* arift_control)
{
D3D11_TEXTURE2D_DESC td;
ZeroMemory(&td, sizeof(td));
td.ArraySize = 1;
td.BindFlags = D3D11_BIND_SHADER_RESOURCE;
td.Usage = D3D11_USAGE_DYNAMIC;
td.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
td.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
td.Height = arift_control->picture_1_.size().height;
td.Width = arift_control->picture_1_.size().width;
td.MipLevels = 1;
td.MiscFlags = 0;
td.SampleDesc.Count = 1;
td.SampleDesc.Quality = 0;
D3D11_SUBRESOURCE_DATA srInitData;
srInitData.pSysMem = arift_control->picture_1_.ptr();
srInitData.SysMemPitch = arift_control->picture_1_.size().width * 4;
ID3D11Texture2D* tex = 0;
if ((device->CreateTexture2D(&td, &srInitData, NULL) == S_FALSE));
{
std::cerr << "Texture Description: OK " << std::endl << "Subresource: OK" << std::endl;
}
if (FAILED(device->CreateTexture2D(&td, &srInitData, &tex)));
{
std::cerr << "Error: Texture could not be created! "<< std::endl;
return false;
}
// Create the shader-resource view
D3D10_SHADER_RESOURCE_VIEW_DESC srDesc;
srDesc.Format = td.Format;
srDesc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D;
srDesc.Texture2D.MostDetailedMip = 0;
srDesc.Texture2D.MipLevels = 1;
if (FAILED(device->CreateShaderResourceView(tex, NULL, &texture_)));
{
std::cerr << "Can't create Shader Resource View" << std::endl;
return false;
}
return true;
}
CreateTexture2D当前2个参数有效时返回S_FALSE,并将0作为第3个参数传递。所以在我的情况下,它也是第一次返回S_FALSE,因此出现Debug Output。当使用第3个参数(TExture COM对象)调用CreateTexture2D时,它崩溃了。我完全不知道了。
此外,我尝试使用DirectX设置调试并遵循该教程:http://blog.rthand.com/post/2010/10/25/Capture-DirectX-1011-debug-output-to-Visual-Studio.aspx - 但我无法看到&#34; Debug&#34;我在Visual Studio 2013中的项目属性中的窗口。所以我仍然得到&#34; igd10iumd32.pdb未加载&#34;窗口,程序崩溃后。
编辑:至少我现在可以解决附加D3D调试输出的问题。在我的Visual Studio 2013中,我必须设置以下内容:项目属性 - &gt;调试 - &gt;调试类型 - &gt;混合获取额外的D3D日志:)
有人可以帮忙吗?这真是令人沮丧,只是整天都陷入了这个单一的功能......
非常感谢!
答案 0 :(得分:1)
D3D11_SUBRESOURCE_DATA
传递的输入纹理数据尺寸不够大。在您的评论中,您说输入图像数据是900x1600,链接是JPEG。但是,您要向D3D指定数据格式为DXGI_FORMAT_B8G8R8A8_UNORM
。 JPEG是一种压缩格式,因此,数据流将小于BGRA格式。当您的驱动器(igd10iumd32.dll)尝试读取此输入流时,它会崩溃,因为缓冲区没有您告诉D3D那么大。
您可以使用D3DX11CreateTextureFromFile
加载JPEG数据。您还可以使用一些免费的图像转换库将JPEG转换为D3D本机兼容格式。