无法让 CreateDDSTextureFromFile 正常工作

Can't get CreateDDSTextureFromFile to work

本文关键字:工作 常工作 CreateDDSTextureFromFile      更新时间:2023-10-16

所以,几个小时以来我一直在试图找出我的问题,但我不知道我做错了什么。在 DirectX 编程方面,我是一个菜鸟,所以我一直在学习一些教程,现在,我正在尝试创建一个 obj 加载器。http://www.braynzarsoft.net/index.php?p=D3D11OBJMODEL

但是,我无法让我的纹理工作。

这就是我尝试加载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(ERROR_NOT_SUPPORTED) 我也试图删除 if 语句,但这只会让我的盒子变黑。知道我做错了什么吗?=/

提前感谢!

最有可能的问题是你的"boxTexture.dds"是一个每像素 24 位的格式文件。在 Direct3D 9 中,这D3DFMT_R8G8B8,而且相当普遍。但是,没有 24 位/像素的 DXGI 等效格式,因此需要格式转换才能工作。

DirectX 工具包中的 DDSTextureLoader 模块设计为开销最小的函数,因此根本不执行运行时转换。如果数据直接映射到 DXGI 格式,则会加载。如果没有,则失败并显示HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) .

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

  1. 理想的解决方案是将"boxTexture.dds"转换为支持的格式。您可以使用 DirectXTex 提供的 texconv 命令行工具执行此操作。这是迄今为止的最佳选择,以便潜在昂贵的转换操作一次性完成,而不是在应用程序运行和加载数据时完成一次。
  2. 如果您实际上没有控制您尝试加载的 dds 文件的来源(即它们是用户提供的任意文件,或者您正在执行某种必须支持旧格式的内容工具),那么您应该使用 DirectXTex"全胖"LoadFromDDSFile函数,该函数具有用于处理旧版 DDS 文件格式的大量转换代码。

请注意,许多旧格式 DDS 文件可能会发生这种情况,如 CodePlex wiki 文档中的列表所示

  • 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: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

另请参阅 Direct3D 11 纹理和块压缩

如果你看一下CreateTextureFromDDS的源代码(由CreateDDSTextureFromFile调用,用于进行主要的数据处理) - http://directxtk.codeplex.com/SourceControl/latest#Src/DDSTextureLoader.cpp - 你会发现有很多原因可能导致"HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)"。

打开或读取文件不太可能有问题,因为这会返回不同的错误代码。因此,很可能是不受支持的DXGI_FORMAT,格式错误的立方体贴图,无效的mipmap计数或无效的图像尺寸(即大于此处的限制:http://msdn.microsoft.com/en-us/library/ff819065(v=vs.85).aspx)。