填坑之路 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 的倍数,所以我们只要调整图片的宽高满足要求即可!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值