使用所有 3 个参数调用时 DirectX Device::CreateTexture2D() 崩溃
DirectX Device::CreateTexture2D() crashes when calling with all 3 params
我将尝试将 2D 纹理从 opencv::Mat 渲染到 DX11 中的纹理,并在之后渲染到 shaderesource。问题是,程序在 Device::CreateTexture2D() 上崩溃,我不知道为什么。我研究了一整天,我就是看不出这里有什么问题。
此外,问题似乎不是 cv::Mat 作为资源,因为我在这里也尝试过这个例子: with the chess-example as resource for the texture... and使用第三个参数调用时,函数仍然崩溃。
我发现其他人对该功能有问题,有时问题是因为没有为 2D 纹理设置 SysMemPitch,但不幸的是这里不是这种情况。
错误输出:ARift.exe 中 0x692EF11E (igd10iumd32.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x03438000。
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 Returns S_FALSE 当前2个参数有效时,将0作为第3个参数传递。所以在我的例子中,它也是第一次 Returns S_FALSE,所以出现调试输出。使用第三个参数(TExture COM 对象)调用 CreateTexture2D 时,它崩溃了。我完全不知道了。
此外,我尝试使用 DirectX 设置调试并遵循该教程:http://blog.rthand.com/post/2010/10/25/Capture-DirectX-1011-debug-output-to-Visual-Studio.aspx - 但我在 [=57 的项目属性中看不到 "Debug" window =] 2013. 所以我在程序崩溃后仍然得到 "igd10iumd32.pdb not loaded" window.
编辑: 至少我现在可以用额外的 D3D 调试输出解决这个问题。在我的 Visual Studio 2013 中,我必须设置以下内容:项目属性 -> 调试 -> 调试类型 -> 混合以获得额外的 D3D 日志:)
有人可以帮忙吗?真的很郁闷,整天卡在一个功能上..
非常感谢!
- 最大
您在 D3D11_SUBRESOURCE_DATA
中传递的输入纹理数据大小不够。在您的评论中,您说输入图像数据是 900x1600,link 是 JPEG。但是,您向 D3D 指定数据格式为 DXGI_FORMAT_B8G8R8A8_UNORM
。 JPEG 是一种压缩格式,因此数据流将小于 BGRA 格式。当您的驱动器 (igd10iumd32.dll) 尝试读取此输入流时,它会崩溃,因为缓冲区没有您告诉 D3D 的那么大。
您可以使用 D3DX11CreateTextureFromFile
加载 JPEG 数据。还有一些免费的图像转换库可用于将 JPEG 转换为 D3D 原生兼容格式。
我将尝试将 2D 纹理从 opencv::Mat 渲染到 DX11 中的纹理,并在之后渲染到 shaderesource。问题是,程序在 Device::CreateTexture2D() 上崩溃,我不知道为什么。我研究了一整天,我就是看不出这里有什么问题。
此外,问题似乎不是 cv::Mat 作为资源,因为我在这里也尝试过这个例子:
我发现其他人对该功能有问题,有时问题是因为没有为 2D 纹理设置 SysMemPitch,但不幸的是这里不是这种情况。
错误输出:ARift.exe 中 0x692EF11E (igd10iumd32.dll) 的第一次机会异常:0xC0000005:访问冲突读取位置 0x03438000。
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 Returns S_FALSE 当前2个参数有效时,将0作为第3个参数传递。所以在我的例子中,它也是第一次 Returns S_FALSE,所以出现调试输出。使用第三个参数(TExture COM 对象)调用 CreateTexture2D 时,它崩溃了。我完全不知道了。
此外,我尝试使用 DirectX 设置调试并遵循该教程:http://blog.rthand.com/post/2010/10/25/Capture-DirectX-1011-debug-output-to-Visual-Studio.aspx - 但我在 [=57 的项目属性中看不到 "Debug" window =] 2013. 所以我在程序崩溃后仍然得到 "igd10iumd32.pdb not loaded" window.
编辑: 至少我现在可以用额外的 D3D 调试输出解决这个问题。在我的 Visual Studio 2013 中,我必须设置以下内容:项目属性 -> 调试 -> 调试类型 -> 混合以获得额外的 D3D 日志:)
有人可以帮忙吗?真的很郁闷,整天卡在一个功能上..
非常感谢!
- 最大
您在 D3D11_SUBRESOURCE_DATA
中传递的输入纹理数据大小不够。在您的评论中,您说输入图像数据是 900x1600,link 是 JPEG。但是,您向 D3D 指定数据格式为 DXGI_FORMAT_B8G8R8A8_UNORM
。 JPEG 是一种压缩格式,因此数据流将小于 BGRA 格式。当您的驱动器 (igd10iumd32.dll) 尝试读取此输入流时,它会崩溃,因为缓冲区没有您告诉 D3D 的那么大。
您可以使用 D3DX11CreateTextureFromFile
加载 JPEG 数据。还有一些免费的图像转换库可用于将 JPEG 转换为 D3D 原生兼容格式。