使用所有 3 个参数调用时 DirectX Device::CreateTexture2D() 崩溃

Posted

技术标签:

【中文标题】使用所有 3 个参数调用时 DirectX Device::CreateTexture2D() 崩溃【英文标题】:DirectX Device::CreateTexture2D() crashes when calling with all 3 params 【发布时间】:2015-03-23 18:11:57 【问题描述】:

我将尝试将 2D 纹理从 opencv::Mat 渲染到 DX11 中的纹理,然后再渲染到 shaderesource。问题是,程序在 Device::CreateTexture2D() 上崩溃了,我不知道为什么。我研究了一整天,我只是看不出这里有什么问题。

此外,问题似乎不是 cv::Mat 作为资源,因为我在这里也尝试过这个例子:D3D11 CreateTexture2D in 32 bit format 用 chess-example 作为纹理的资源......并且函数仍然崩溃,使用第三个参数调用时。

我发现其他人对该功能有问题,有时问题是因为 SysMemPitch 没有设置为 2D 纹理,但不幸的是这里不是这种情况。


错误输出: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 当前 2 个参数有效时返回 S_FALSE,并将 0 作为第三个参数传递。所以在我的情况下,它也是第一次返回 S_FALSE,所以出现了调试输出。当使用第三个参数(TExture COM 对象)调用 CreateTexture2D 时,它崩溃了。我完全不知道了。

此外,我尝试使用 DirectX 设置调试并遵循该教程:http://blog.rthand.com/post/2010/10/25/Capture-DirectX-1011-debug-output-to-Visual-Studio.aspx - 但我在 Visual Studio 2013 的项目属性中看不到“调试”窗口。所以我仍然可以访问“igd10iumd32.pdb未加载”窗口,程序崩溃后。

编辑:至少我现在可以解决附加 D3D 调试输出的问题。在我的 Visual Studio 2013 中,我必须设置以下内容:项目属性 -> 调试 -> 调试类型 -> 混合以获得附加 D3D 日志:)

有人可以帮忙吗?真是令人沮丧,整天卡在一个功能上..

非常感谢!

最大

【问题讨论】:

igd10iumd32.dll 是您的图形驱动程序(英特尔)。很可能,您通过 D3D 向它传递了一些无效的数据指针,并且它没有检查它。我怀疑是D3D11_SUBRESOURCE_DATA 的内容。如果省略它会崩溃吗(将 NULL 作为 p2 传递)? 首先,非常感谢您的回答,我对此感到非常绝望,我整天都在努力完成这项工作... device->CreateTexture2D(&tdesc, &srInitData, NULL ) 返回 S_FALSE,这意味着根据文档,参数有效且正常。 device->CreateTexture2D(&tdesc, NULL, &tex))) 也可以,但之后它在 CreateShaderResourceView 上崩溃了 顺便说一句。使用的 cv::Mat (picture_1_) 的宽度为 900,高度为 1600,这可能是个问题吗?但这会很奇怪,因为根据 CreateTexture2D (S_FALSE) 的返回类型,前 2 个参数似乎是有效的。 这些维度应该没问题,但是,将 NULL 作为第二个参数传递并避免崩溃表明您的输入数据是一个问题。可能您的输入数据大小不合适(即它需要为 900*4 * 1600 字节)。 另外,要查看调试 D3D 运行时的调试输出,他们所说的“输出窗口”是进程的调试输出。在 VS 菜单中,它是 View->Output(或 Alt+2),并将下拉菜单设置为“Debug”。通常在你开始调试时会默认弹出这个。 【参考方案1】:

您在D3D11_SUBRESOURCE_DATA 中传递的输入纹理数据大小不足。在您的评论中,您说输入图像数据为 900x1600,链接为 JPEG。但是,您向 D3D 指定数据格式为 DXGI_FORMAT_B8G8R8A8_UNORM。 JPEG 是一种压缩格式,因此数据流将小于 BGRA 格式。当您的驱动器 (igd10iumd32.dll) 尝试读取此输入流时,它会崩溃,因为缓冲区没有您告诉 D3D 的那么大。

您可以使用D3DX11CreateTextureFromFile 加载JPEG 数据。还有一些免费的图像转换库可用于将 JPEG 转换为 D3D 本机兼容格式。

【讨论】:

哦,好吧。无论如何,这只是一张测试图片。正如我所提到的,我实际上想将相机流渲染为纹理。相机模式当前设置为 RGB8,这意味着 8 位/通道、24 位/像素和总共 24 位。使用该格式没有 Alpha 通道。所以我需要为我的纹理使用 DXGI_FORMAT_R8G8B8A8_UNORM,对吗?就这样? SystemPith 保持“宽度 * 4” 这样吗?非常感谢您的帮助,我很感激! :) 没问题,但是,这是一个不同的问题。将此标记为已回答,并询问其他人是否有其他问题... 好的,我设置为已回答。再次感谢。我现在要提出一个新问题:) 很遗憾,CreateShaderResourceView() 仍然存在问题。想不通。我在 *** 上设置了另外两个问题,希望能解决这个问题。如果您有时间,如果您能再帮我一次,我将非常高兴。 [1] ***.com/questions/29265034/… , [2] ***.com/questions/29316524/… - 非常感谢!

以上是关于使用所有 3 个参数调用时 DirectX Device::CreateTexture2D() 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

DirectX 11.1 和 Win32 桌面

DirectX - 每次调用 D3DXCreateTextureFromFile() 的新设备参考?

Directx Matrix.PerspectiveFovLH Matrix.PerspectiveFovRH的理解

在 CMD 批处理脚本中调用标签时如何使用超过 9 个参数?

使用 Allegro / SDL 与 OpenGL / DirectX 制作游戏时,我会遇到哪些限制?

Directx 11 运行时错误