Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DirectX设备::CreateTexture2D()在使用所有3个参数调用时崩溃_Directx - Fatal编程技术网

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

DirectX设备::CreateTexture2D()在使用所有3个参数调用时崩溃,directx,Directx,我将尝试将opencv::Mat中的2D纹理渲染为DX11中的纹理,以及战后的ShaderResource。问题是,程序在设备::CreateTexture2D()上崩溃,我不知道为什么。我研究了一整天,我只是不知道这里出了什么问题 此外,问题似乎不是cv::Mat作为资源,因为我在这里也尝试了这个示例:使用chess示例作为纹理的资源。。。当使用第三个参数调用时,函数仍然崩溃 我发现其他人对该函数有问题,有时问题是因为SysMemPitch没有为2D纹理设置,但不幸的是,这里的情况并非如此

我将尝试将opencv::Mat中的2D纹理渲染为DX11中的纹理,以及战后的ShaderResource。问题是,程序在设备::CreateTexture2D()上崩溃,我不知道为什么。我研究了一整天,我只是不知道这里出了什么问题

此外,问题似乎不是cv::Mat作为资源,因为我在这里也尝试了这个示例:使用chess示例作为纹理的资源。。。当使用第三个参数调用时,函数仍然崩溃

我发现其他人对该函数有问题,有时问题是因为SysMemPitch没有为2D纹理设置,但不幸的是,这里的情况并非如此


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

ARift.exe中0x692EF11E(igd10iumd32.dll)处未处理的异常:0xC0000005:访问冲突读取位置0x03438000。 以下是相关代码:


bool纹理::InitCameraStream(ID3D11Device*设备,ARiftControl*ariftu控件)
{
D3D11_纹理2D_描述td;
零内存(&td,sizeof(td));
td.ArraySize=1;
td.BindFlags=D3D11_BIND_SHADER_资源;
td.Usage=D3D11_Usage_DYNAMIC;
td.CPUAccessFlags=D3D11\u CPU\u访问\u写入;
td.Format=DXGI_Format_B8G8R8A8_UNORM;
td.Height=arift\u control->picture\u 1\u.size().Height;
td.Width=arift\u control->picture\u 1\u.size().Width;
td.mip水平=1;
td.miscsflags=0;
td.SampleDesc.Count=1;
td.SampleDesc.Quality=0;
D3D11_子资源_数据srInitData;
srInitData.psysem=arift_control->picture_1_.ptr();
srInitData.SysMemPitch=arift\u control->picture\u 1\u.size().width*4;
ID3D11Texture2D*tex=0;
如果((设备->创建纹理2d(&td,&srInitData,NULL)=S_FALSE));
{

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


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

igd10iumd32.dll是您的图形驱动程序(英特尔)。很可能,您正在通过D3D向它传递一些无效的数据指针,但它没有检查它。我怀疑它是
D3D11\u SUBRESOURCE\u data
的内容。如果忽略它(将NULL作为p2传递),它会崩溃吗?首先,非常感谢你的回答,我真的很绝望,我一整天都在努力完成这项工作…设备->CreateTexture2D(&tdesc,&srInitData,NULL)返回S_FALSE,这意味着根据docu,参数是有效且正常的。设备->CreateTexture2D(&tdesc,NULL,&tex)))也可以工作,但战后它在CreateShaderResourceViewTW上崩溃。使用的cv::Mat(picture_1_)的宽度为900,高度为1600,这可能是个问题吗?但这会很奇怪,因为根据CreateTexture2D的返回类型,前两个参数似乎是有效的(S_FALSE)。这些维度应该可以,但是,将NULL作为第二个参数传递并避免崩溃表明您的输入数据是一个问题。您的输入数据可能大小不合适(即需要900*4*1600字节)。此外,要查看调试D3D运行时的调试输出,“输出窗口”他们讨论的是进程的调试输出。在VS菜单中,是View->output(或Alt+2),并将下拉菜单设置为“debug”。通常在开始调试时,默认情况下会弹出。哦,好的。无论如何,这只是一张测试图片。正如我提到的,我实际上想将摄影机流渲染为纹理。摄影机模式当前设置为RGB8,这意味着8位/通道、24位/像素和总共24位。使用该格式时,没有Alpha通道。因此我需要使用DXGI_为我的纹理设置格式,对吗?仅此而已?系统髓保持“宽度*4”那么?非常感谢你的帮助,我很感激!:)没问题,但是,这是一个不同的问题。将此标记为已回答,然后询问另一个问题,如果其他问题不起作用…好的,我设置为已回答。再次感谢。我现在要提出一个新问题:)不幸的是,我在CreateShaderResourceView()方面仍然存在问题我在StackOverflow上设置了另外两个问题,希望能解决这个问题。如果你有时间,如果你能再帮我一次,我将非常高兴。[1],[2]-非常感谢!
        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;
}