Не удается заставить 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, но это просто сделает мой ящик черным.
Есть идеи, что я делаю не так? знак равно

Заранее спасибо!

1

Решение

Наиболее вероятная проблема заключается в том, что ваш «boxTexture.dds» представляет собой файл формата 24 бита на пиксель. В Direct3D 9 это было D3DFMT_R8G8B8 и был достаточно распространен. Тем не менее, есть нет эквивалентного формата DXGI для 24 бит на пиксель, и поэтому для работы требуется преобразование формата.

Модуль DDSTextureLoader в Набор инструментов DirectX разработан, чтобы быть функцией минимальных издержек, и поэтому делает нет конвертации во время выполнения вообще. Если данные напрямую отображаются в формат DXGI, они загружаются. Если это не так, это не с HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED),

Есть два разных решения в зависимости от вашего сценария использования.

  1. Идеальное решение — конвертировать boxTexture.dds в поддерживаемый формат. Вы можете сделать это с texconv инструмент командной строки DirectXTex. На данный момент это лучший вариант, так как потенциально дорогостоящая операция преобразования выполняется один раз, а не один раз, когда приложение запускает и загружает данные.
  2. Если вы на самом деле не контролируете источник файлов dds, которые вы пытаетесь загрузить (т. Е. Они являются произвольными файлами, предоставленными пользователем, или вы используете какой-либо инструмент контента, который должен поддерживать устаревшие форматы), то вам следует воспользоваться DirectXTex «Цельное» LoadFromDDSFile функция, которая имеет обширный код преобразования для обработки устаревших форматов файлов DDS.

Обратите внимание, что такая ситуация может возникнуть для ряда устаревших файлов формата DDS, перечисленных в списке Вики-документация CodePlex

  • D3DFMT_R8G8B8 (RGB 24bpp) — использовать формат 32bpp
  • D3DFMT_X8B8G8R8 (RGBX 32 бит / с) — используйте 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 текстуры и сжатие блоков

3

Другие решения

Если вы посмотрите на исходный код 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 ).

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector