使用所有3个参数调用DirectX Device::CreateTexture2D()时崩溃 [英] DirectX Device::CreateTexture2D() crashes when calling with all 3 params

查看:17
本文介绍了使用所有3个参数调用DirectX Device::CreateTexture2D()时崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将尝试将一个2D纹理从OpenCV::MAT渲染到DX11中的纹理以及战后的着色器资源。问题是,程序在Device::CreateTexture2D()上崩溃,我找不到原因。我研究了一整天,就是看不出有什么问题。

此外,问题似乎不是cv::mat作为资源,因为我在这里也尝试了这个示例:D3D11 CreateTexture2D in 32 bit format,将象棋示例作为纹理的资源...当使用第三个参数调用时,函数仍会崩溃。

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


错误输出:ARift.exe:0xC0000005中0x692EF11E(igd10iumd32.dll)的第一次机会异常:读取位置0x03438000的访问冲突。

ARift.exe:0xC0000005中0x692EF11E(igd10iumd32.dll)处的未处理异常:读取位置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返回S_FALSE,并将0作为第三个参数传递。因此,在我的例子中,它还在第一次返回S_FALSE,因此会出现Debug输出。当使用第三个参数(纹理COM对象)调用CreateTexture2D时,它崩溃了。我完全不知道了。

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

编辑:至少我现在可以修复其他D3D调试输出的问题。在我的Visual Studio 2013中,我必须设置以下内容:项目属性->调试->调试类型->混合以获取额外的D3D日志:)

这里有人能帮忙吗?这真的很令人沮丧,只是一整天都停留在那个单一的功能上。

非常感谢!

  • 最大

推荐答案

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

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

这篇关于使用所有3个参数调用DirectX Device::CreateTexture2D()时崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆