如果格式为 BC3_UNORM 的纹理没有 4 的分辨率倍数怎么办?

What should I do if a texture formatted BC3_UNORM don't have a resolution multiple of 4?

enter image description here

我有一个分辨率为 95x90 且格式为 DXGI_FORMAT_BC3_UNORM 的纹理。 我尝试加载此纹理,但出现以下错误。

D3D11 错误:ID3D11Device::CreateTexture2D:使用以下格式(0x4d,BC3_UNORM)创建的 Texture2D 在资源尺寸上遇到对齐限制。尺寸(宽度:95,高度:90)必须是(宽度:4,高度:4)的倍数。 [STATE_CREATION错误#101:CREATETEXTURE2D_INVALIDDIMENSIONS]

我打开 Painter 应用程序并调整原始纹理的大小毫无意义。 有什么好的方法可以解决这个错误吗?

+

如果我使用 Visual Studio 加载纹理,它的维度倍数为 4。

enter image description here

用DirectX Tex加载贴图时不一样

auto hr = DirectX::CreateDDSTextureFromFile(Graphic::Device(), path.data(), &_texture, &_srv);

DirectX 的正式规则是 BC 压缩图像的 'top-level' 图像宽度和高度必须是 4 的倍数,但是 mipmap 显然会导致非 4 的倍数值。还有处理 1x1、1x2、2x1 和 2x2 像素情况的特殊规则。

DirectXTex 可以块压缩艺术库大小的图像以支持 mipmap。

我的 texconv 工具中有一个 -fixbc4x4: 开关专门用于这种情况。它 'resizes' 没有 decompression/compression 循环的最高 mip 级别,但它会丢失任何 mip 级别,因此如果你想重新生成它们,你最终会 decompressing/compressing 。

所以简而言之,这将创建一个 DDS 纹理版本,其中最顶层四舍五入为 4x4 倍数,而不对块进行任何修改。

texconv -fixbc4x4 -m 1 inputdds.dds

这将在不对块进行任何修改的情况下修复最顶层,解压缩图像,生成 mips,然后重新压缩。

texconv -fixbc4x4 -m 0 inputdds.dds