填坑之路 DirectX11(二)使用 DirectXTex 读取 DDS 文件时报错解决方案
作者:互联网
近日学习 Direct3D 需要加载一幅纹理贴图到内存中,但由于新的 Windows SDK 不包含 d3dx11.lib,所以只能依赖第三方库进行开发。
了解到 DirectXTex 可以处理该需求后,二话不说往项目中引入依赖,然而在代码正常运行的前提下,纹理贴图无法加载到内存中,于是就产生了这篇文章。
本文目的:
(1)学会往自己的 Direct3D 项目中添加额外的引用;
(2)分析读取 DDS 文件时报错的原因并解决
引用 DirectXTex 库
按照下图的步骤一步一步来,不会出现任何问题:
然后在你需要使用到这个库的地方引入头文件:
#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 文件成功后,画面并没有渲染贴图资源,非常诡异地有一块黑掉了。
然后查了网上的资料后也没有什么结果,突然发现控制台输出了报错信息:
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
的倍数,所以我们只要调整图片的宽高满足要求即可!
标签:GitHub,DDS,image,nullptr,Width,填坑,DirectX11,DirectXTex 来源: https://blog.csdn.net/weixin_41949328/article/details/112787799