1

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

提前致谢!

4

2 回答 2

3

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

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 文档中列出的许多旧格式 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 纹理和块压缩

于 2015-01-15T19:27:44.687 回答
0

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

于 2015-01-14T21:15:04.167 回答