【问题标题】:Can't get CreateDDSTextureFromFile to work无法让 CreateDDSTextureFromFile 工作
【发布时间】:2015-03-13 03:56:00
【问题描述】:

所以,我已经尝试找出我的问题几个小时了,但我不知道我做错了什么。在 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 语句,但这只会让我的盒子变黑。 知道我做错了什么吗? =/

提前致谢!

【问题讨论】:

  • 看起来您正在使用 DirectXTex 库,因此您应该拥有实际的源代码。如果您尝试在调试器中单步执行该函数,它会在哪里失败?
  • 我正在使用 DirectX 工具包。我介入了它,但是呃..我不确定它到底是哪里出错了..
  • 请注意,您可以使用 DirectXMesh 中的 meshconvert 将 Wavefront OBJ 模型转换为 VBO、CMO 或 SDKMESH,然后使用 Model 加载带有 DirectX Tool Kit 的模型。查看here 进行演练。

标签: c++ directx directx-11 hresult dds-format


【解决方案1】:

最可能的问题是您的“boxTexture.dds”是一个每像素 24 位的格式文件。在 Direct3D 9 中,这是D3DFMT_R8G8B8 并且相当普遍。但是,no DXGI equivalent format 表示每像素 24 位,因此需要进行格式转换。

DirectX Tool Kit 中的 DDSTextureLoader 模块被设计为开销最小的函数,因此根本不进行运行时转换。如果数据直接映射到 DXGI 格式,则会加载。如果没有,它会以HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) 失败。

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

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

请注意,CodePlex wiki documentation 中列出的许多旧格式 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: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 Textures and Block Compression

【讨论】:

    【解决方案2】:

    如果您查看 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)。

    【讨论】:

    • 是的,它似乎不喜欢我的 DXGI_FORMAT: DXGI_FORMAT_UNKNOWN;格式 = GetDXGIFormat( header->ddspf );它将格式设置为未知。这是为什么呢?
    • 文件损坏,实际上不是 DDS 文件,或者是某种奇怪/旧格式。无法访问给您带来麻烦的图像文件,这是我能做的最好的事情。尝试在一个程序中查看图像,该程序可以让您查看 DDS 并查看它是否在那里工作。 DXGI_FORMAT_UNKNOWN 意味着:图像数据的格式是未知的(因此,除了将数据保存到其他文件之外,没有任何用处)。如果这是唯一错误的地方,您可以尝试将其设置为每种格式并查看结果(如果有),直到它看起来正确。然后你就知道格式了。
    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 2020-02-23
    • 2014-12-26
    • 2017-12-22
    • 2012-02-28
    • 2015-12-01
    • 2012-01-29
    • 2014-12-16
    相关资源
    最近更新 更多