填坑之路 DirectX11(二)使用 DirectXTex 读取 DDS 文件时报错解决方案

近日学习 Direct3D 需要加载一幅纹理贴图到内存中,但由于新的 Windows SDK 不包含 d3dx11.lib,所以只能依赖第三方库进行开发。

了解到 DirectXTex 可以处理该需求后,二话不说往项目中引入依赖,然而在代码正常运行的前提下,纹理贴图无法加载到内存中,于是就产生了这篇文章。

本文目的:

(1)学会往自己的 Direct3D 项目中添加额外的引用;

(2)分析读取 DDS 文件时报错的原因并解决

引用 DirectXTex 库

按照下图的步骤一步一步来,不会出现任何问题:
填坑之路 DirectX11(二)使用 DirectXTex 读取 DDS 文件时报错解决方案
填坑之路 DirectX11(二)使用 DirectXTex 读取 DDS 文件时报错解决方案填坑之路 DirectX11(二)使用 DirectXTex 读取 DDS 文件时报错解决方案
然后在你需要使用到这个库的地方引入头文件:

#include<DirectXTex.h>

然后就可以愉快的写代码用里面的东西了。怎么使用这里不详细说,我在这里给出一个 GitHub 上的示例代码,实际上这个仓库已经有非常详细的文档教我们怎么使用了:DirectXTex GitHub 地址

示例

在没有使用这个库前,我依旧使用 d3dx11.lib 这一个库,但是它必须要安装 DirectX SDK 且配置路径才可以用,很不方便,之前的导入资源的代码是这样的:

D3DX11CreateShaderResourceViewFromFile(d3dDevice, filePath, 0, 0, &carBodyColorMap, 0);

使用了 DirectXTex 后,我在项目中需要读取 DDS 资源到内存中,所以阅读 GitHub 的文档后代码就是下面这样子:

wchar_t const* filename = L"filePath";
wchar_t ext[_MAX_EXT] = {};
_wsplitpath_s(filename, nullptr, 0, nullptr, 0, nullptr, 0, ext, _MAX_EXT);
ScratchImage image;
LoadFromDDSFile(filename, DDS_FLAGS_NONE, nullptr, image);
HRESULT res = CreateShaderResourceView(d3dDevice, image.GetImages(), image.GetImageCount(), image.GetMetadata(), &carBodyColorMap);

GitHub的教程会很详细,非常推荐去读文档!

报错原因

在读入 DDS 文件成功后,画面并没有渲染贴图资源,非常诡异地有一块黑掉了。
填坑之路 DirectX11(二)使用 DirectXTex 读取 DDS 文件时报错解决方案
然后查了网上的资料后也没有什么结果,突然发现控制台输出了报错信息:

D3D11 ERROR: ID3D11Device::CreateTexture2D: A Texture2D created with the following Format (0x47, BC1_UNORM) experiences aligment restrictions on the dimensions of the Resource. The dimensions, which are (Width: 827, Height: 964), must be multiples of (Width: 4, Height: 4). [ STATE_CREATION ERROR #101: CREATETEXTURE2D_INVALIDDIMENSIONS]

关键就在这一句:

 which are (Width: 827, Height: 964), must be multiples of (Width: 4, Height: 4)

说明 dds 图片的宽高必须都是 4 的倍数,所以我们只要调整图片的宽高满足要求即可!

上一篇:简单企业网络三层模型模拟


下一篇:交换机MAC地址绑定