无法让 CreateDDSTextureFromFile 工作
Can't get CreateDDSTextureFromFile to work
所以,几个小时以来我一直在努力找出我的问题,但我不知道我做错了什么。在 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 语句,但这只会使我的框变黑。
知道我做错了什么吗? =/
提前致谢!
如果您查看 CreateTextureFromDDS 的源代码(由 CreateDDSTextureFromFile 调用以进行主要数据处理)- http://directxtk.codeplex.com/SourceControl/latest#Src/DDSTextureLoader.cpp - 您会发现有很多原因可能导致 "HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)".
这不太可能是打开或读取文件的问题,因为那会 return 不同的错误代码。所以很可能它是不受支持的 DXGI_FORMAT、格式错误的立方体贴图、无效的 mipmap 计数或无效的图像尺寸(即大于此处找到的限制:http://msdn.microsoft.com/en-us/library/ff819065(v=vs.85).aspx)。
最有可能的问题是您的 "boxTexture.dds" 是一个每像素 24 位格式的文件。在 Direct3D 9 中,这是 D3DFMT_R8G8B8
并且相当普遍。但是,每像素 24 位 no DXGI equivalent format,因此需要格式转换才能工作。
DirectX Tool Kit 中的 DDSTextureLoader 模块被设计为最小开销函数,因此 根本没有运行时转换。如果数据直接映射到 DXGI 格式,则会加载。如果没有,则失败并显示 HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)
.
根据您的使用场景,有两种不同的解决方案。
- 理想的解决方案是将 'boxTexture.dds' 转换为受支持的格式。您可以使用 DirectXTex 提供的 texconv 命令行工具来完成此操作。这是目前为止最好的选择,这样可能代价高昂的转换操作就可以一次性完成,而不是在您的应用程序运行和加载数据时一次性完成。
- 如果您实际上没有控制您尝试加载的 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) - Swizzle to YUY2
所以,几个小时以来我一直在努力找出我的问题,但我不知道我做错了什么。在 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 语句,但这只会使我的框变黑。 知道我做错了什么吗? =/
提前致谢!
如果您查看 CreateTextureFromDDS 的源代码(由 CreateDDSTextureFromFile 调用以进行主要数据处理)- http://directxtk.codeplex.com/SourceControl/latest#Src/DDSTextureLoader.cpp - 您会发现有很多原因可能导致 "HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)".
这不太可能是打开或读取文件的问题,因为那会 return 不同的错误代码。所以很可能它是不受支持的 DXGI_FORMAT、格式错误的立方体贴图、无效的 mipmap 计数或无效的图像尺寸(即大于此处找到的限制:http://msdn.microsoft.com/en-us/library/ff819065(v=vs.85).aspx)。
最有可能的问题是您的 "boxTexture.dds" 是一个每像素 24 位格式的文件。在 Direct3D 9 中,这是 D3DFMT_R8G8B8
并且相当普遍。但是,每像素 24 位 no DXGI equivalent format,因此需要格式转换才能工作。
DirectX Tool Kit 中的 DDSTextureLoader 模块被设计为最小开销函数,因此 根本没有运行时转换。如果数据直接映射到 DXGI 格式,则会加载。如果没有,则失败并显示 HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)
.
根据您的使用场景,有两种不同的解决方案。
- 理想的解决方案是将 'boxTexture.dds' 转换为受支持的格式。您可以使用 DirectXTex 提供的 texconv 命令行工具来完成此操作。这是目前为止最好的选择,这样可能代价高昂的转换操作就可以一次性完成,而不是在您的应用程序运行和加载数据时一次性完成。
- 如果您实际上没有控制您尝试加载的 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) - Swizzle to YUY2