Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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
C++ Can';无法让CreateDDSTextureFromFile工作_C++_Directx_Directx 11_Hresult_Dds Format - Fatal编程技术网

C++ Can';无法让CreateDDSTextureFromFile工作

C++ Can';无法让CreateDDSTextureFromFile工作,c++,directx,directx-11,hresult,dds-format,C++,Directx,Directx 11,Hresult,Dds Format,所以,我已经试着解决我的问题几个小时了,但我不知道我做错了什么。谈到DirectX编程,我是个新手,所以我一直在学习一些教程,现在,我正在尝试创建一个obj加载程序。 然而,我不能让我的纹理工作 以下是我尝试加载DDS纹理的方式: ID3D11ShaderResourceView* tempMeshSRV = nullptr; hr = CreateDDSTextureFromFile(gDevice, L"boxTexture.dds", NULL, &tempMeshSRV);

所以,我已经试着解决我的问题几个小时了,但我不知道我做错了什么。谈到DirectX编程,我是个新手,所以我一直在学习一些教程,现在,我正在尝试创建一个obj加载程序。

然而,我不能让我的纹理工作

以下是我尝试加载DDS纹理的方式:

ID3D11ShaderResourceView* tempMeshSRV = nullptr;
hr = CreateDDSTextureFromFile(gDevice, L"boxTexture.dds", NULL, &tempMeshSRV);

if (SUCCEEDED(hr))
 {
 textureNameArray.push_back(L"boxTexture.dds");
 material[matCount - 1].texArrayIndex = meshSRV.size();
 meshSRV.push_back(tempMeshSRV);
 material[matCount - 1].hasTexture = true;
 }
然而,我的HRESULT永远不会成功,但它也不会崩溃。如果我浏览hr,它只会说“HRESULT_FROM_WIN32(不支持错误),我还试图删除If语句,但这只会使我的框变黑。 知道我做错了什么吗=/


提前感谢!

如果您查看CreateTextureFromDDS的源代码(CreateDDSSTextureFromFile调用该源代码来执行主数据处理)-您将看到有很多原因可能会导致“来自WIN32的HRESULT(错误\u不受支持)”


打开或读取文件可能不会出现问题,因为这会返回不同的错误代码。因此,最有可能是不支持的DXGI_格式、格式错误的立方体映射、无效的mipmap计数或无效的图像尺寸(即大于此处的限值:)。

最有可能的问题是“boxture.dds”“是每像素24位格式的文件。在Direct3D 9中,这是
D3DFMT_R8G8B8
,相当普遍。但是,每像素有24位,因此需要进行格式转换才能工作

中的DDSTextureLoader模块设计为最小开销函数,因此根本不进行运行时转换。如果数据直接映射到DXGI格式,则会加载。如果没有,它将失败,并从WIN32发出
HRESULT\u(错误\u不受支持)

根据您的使用场景,有两种不同的解决方案

  • 理想的解决方案是将“boxture.dds”转换为支持的格式。可以使用随附的texconv命令行工具执行此操作。这是迄今为止最好的选择,这样一来,潜在的昂贵转换操作只需执行一次,而不是在应用程序运行和加载数据时执行一次
  • 如果您没有实际控制要加载的dds文件的源(即,它们是用户提供的任意文件,或者您正在使用某种必须支持传统格式的内容工具),然后,您应该使用“full fat”
    LoadFromDDSFile
    函数,该函数具有用于处理旧DDS文件格式的大量转换代码
  • 注意:对于中列出的许多旧格式DDS文件,可能会出现这种情况

    • D3DFMT_R8G8B8(24bpp RGB)-使用32bpp格式
    • D3DFMT_X8B8G8R8(32bpp RGBX)-使用BGRX、BGRA或RGBA
    • D3DFMT_A2R10G10B10(BGRA 10:10:10:2)-使用RGBA 10:10:10:2
    • D3DFMT_X1R5G5B5(BGR 5:5:5)-使用BGRA 5:5:1或BGR 5:6:5
    • D3DFMT_A8R3G3B2,D3DFMT_R3G3B2(BGR 3:3:2)-扩展到支持的格式
    • D3DFMT_P8、D3DFMT_A8P8(8位调色板)-扩展到支持的格式
    • D3DFMT_A4L4(亮度4:4)-扩展到支持的格式
    • D3DFMT_UYVY(YUV 4:2:2 16bpp)-快速旋转至YUY2

    另请参见

    看起来您正在使用DirectXTex库,因此您应该拥有实际的源代码。如果您尝试在调试器中单步执行该函数,它在哪里失败?我正在使用DirectX工具包。我进去了,但是。。我不确定错误的确切位置。请注意,您可以使用meshconvert from将波前OBJ模型转换为VBO、CMO或SDKMESH,然后使用
    Model
    加载这些模型。寻找一个走查。是的,它似乎不喜欢我的DXGI\u格式:DXGI\u格式未知;格式=GetDXGIFormat(标题->ddspf);它将格式设置为未知。这是为什么?要么文件已损坏,实际上不是DDS文件,要么是某种奇怪/旧格式。没有访问给你带来麻烦的图像文件,这是我能做的最好的了。尝试在一个程序中查看图像,该程序将允许您查看DDS,并查看它是否在那里工作。DXGI_FORMAT_UNKNOWN的意思是:图像数据的格式是未知的(因此,除了将数据保存到其他文件之外,没有其他有用的方法)。如果这是唯一的错误,您可以尝试将其设置为每种格式,并查看结果(如果有),直到它看起来正确为止。那你就知道格式了。