Не удается заставить CreateDDSTextureFromFile работать
Итак, я пытаюсь выяснить свою проблему в течение нескольких часов, но я понятия не имею, что я делаю неправильно. Я новичок, когда дело доходит до программирования 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 никогда не будет успешным, но он также не падает. Если я нахожу пылесос над часом, он просто говорит: "HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) Я также пытался удалить оператор if, но это просто сделает мой ящик черным. Любая идея о том, что я делаю неправильно? =/
Заранее спасибо!
2 ответа
Наиболее вероятная проблема заключается в том, что ваш "boxTexture.dds" представляет собой файл формата 24 бита на пиксель. В Direct3D 9 это было D3DFMT_R8G8B8
и был достаточно распространен. Однако не существует формата, эквивалентного DXGI для 24 бит на пиксель, и поэтому для его работы требуется преобразование формата.
Модуль DDSTextureLoader в DirectX Tool Kit предназначен для использования в качестве функции с минимальными издержками и поэтому не выполняет преобразований во время выполнения вообще. Если данные напрямую отображаются в формат DXGI, они загружаются. Если это не так, это не с HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)
,
Есть два разных решения в зависимости от вашего сценария использования.
- Идеальное решение - преобразовать boxTexture.dds в поддерживаемый формат. Вы можете сделать это с помощью инструмента командной строки texconv, поставляемого с DirectXTex. На данный момент это лучший вариант, так как потенциально дорогостоящая операция преобразования выполняется один раз, а не один раз, когда ваше приложение запускает и загружает данные.
- Если вы на самом деле не контролируете источник файлов dds, которые вы пытаетесь загрузить (т. Е. Они являются произвольными файлами, предоставленными пользователем, или вы используете какой-либо инструмент контента, который должен поддерживать устаревшие форматы), то вам следует использовать DirectXTex "полный жир"
LoadFromDDSFile
функция, которая имеет обширный код преобразования для обработки устаревших форматов файлов DDS.
Обратите внимание, что такая ситуация может возникнуть для ряда файлов DDS устаревшего формата, перечисленных в вики-документации CodePlex.
- D3DFMT_R8G8B8 (RGB 24bpp) - использовать формат 32bpp
- D3DFMT_X8B8G8R8 (32GBpp 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 - вы увидите, что есть множество причин, по которым вы можете получить "HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)".
Скорее всего, это проблема с открытием или чтением файла, так как это приведет к другому коду ошибки. Так что, скорее всего, это неподдерживаемый DXGI_FORMAT, неправильно сформированная кубическая карта, недопустимое число mipmap или неверные размеры изображения (т. Е. Больше, чем указанные здесь ограничения: http://msdn.microsoft.com/en-us/library/ff819065(v=vs.85).aspx).