无法让 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 语句,但这只会让我的盒子变黑。知道我做错了什么吗?=/
提前感谢!
最有可能的问题是你的"boxTexture.dds"是一个每像素 24 位的格式文件。在 Direct3D 9 中,这D3DFMT_R8G8B8
,而且相当普遍。但是,没有 24 位/像素的 DXGI 等效格式,因此需要格式转换才能工作。
DirectX 工具包中的 DDSTextureLoader 模块设计为开销最小的函数,因此根本不执行运行时转换。如果数据直接映射到 DXGI 格式,则会加载。如果没有,则失败并显示HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)
.
根据您的使用方案,有两种不同的解决方案。
- 理想的解决方案是将"boxTexture.dds"转换为支持的格式。您可以使用 DirectXTex 提供的 texconv 命令行工具执行此操作。这是迄今为止的最佳选择,以便潜在昂贵的转换操作一次性完成,而不是在应用程序运行和加载数据时完成一次。
- 如果您实际上没有控制您尝试加载的 dds 文件的来源(即它们是用户提供的任意文件,或者您正在执行某种必须支持旧格式的内容工具),那么您应该使用 DirectXTex"全胖"
LoadFromDDSFile
函数,该函数具有用于处理旧版 DDS 文件格式的大量转换代码。
请注意,许多旧格式 DDS 文件可能会发生这种情况,如 CodePlex wiki 文档中的列表所示
- 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) - 旋转到 YUY2
另请参阅 Direct3D 11 纹理和块压缩
如果你看一下CreateTextureFromDDS的源代码(由CreateDDSTextureFromFile调用,用于进行主要的数据处理) - http://directxtk.codeplex.com/SourceControl/latest#Src/DDSTextureLoader.cpp - 你会发现有很多原因可能导致"HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)"。
打开或读取文件不太可能有问题,因为这会返回不同的错误代码。因此,很可能是不受支持的DXGI_FORMAT,格式错误的立方体贴图,无效的mipmap计数或无效的图像尺寸(即大于此处的限制:http://msdn.microsoft.com/en-us/library/ff819065(v=vs.85).aspx)。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程