Как превратить данные mipmap в растровое изображение? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть текстурный файл .DDS с форматом DXGI_FORMAT_BC3_UNORM, который содержит 10 mip-карт, которые я связал здесь:

https://1drv.ms/u/s!AiGFMy6hVmtN1Ba3UZsc8682VcEO

Я хотел бы отобразить каждый отдельный mipmapэтой текстуры в пользовательский интерфейс моего приложения XAML, поэтому мне нужно преобразовать их в растровые изображения.

Я получаю данные для каждого mipmap из 5-го параметра функции DirectX::LoadDDSTextureFromMemory из вспомогательной библиотеки DirectXTK12, которая возвращает std::vector<D3D12_SUBRESOURCE_DATA> заполнено данными для всех 10 mip-карт.

Я могу превратить mipmap 0 самого высокого качества в растровое изображение, используя следующий код:

std::vector<unsigned char> bytes = get_data_from_dds_file(L"WoodCrate01.dds");

std::vector<D3D12_SUBRESOURCE_DATA> subresources;
winrt::check_hresult(
    DirectX::LoadDDSTextureFromMemory(
        g_device,
        &bytes.front(),
        file_size,
        gpu_tex_resource.put(),
        subresources
    )
);

auto current_index = 0;

auto current_slice_pitch = subresources[current_index].SlicePitch;

std::vector<unsigned char> current_subresource_data;
current_subresource_data.resize(current_slice_pitch);
memcpy(&current_subresource_data[0], subresources[current_index].pData, current_slice_pitch);

Windows::Storage::Streams::InMemoryRandomAccessStream random_stream;
Windows::Storage::Streams::DataWriter writer(random_stream);

writer.WriteBytes(current_subresource_data);
co_await writer.StoreAsync();

auto decoder = co_await Windows::Graphics::Imaging::BitmapDecoder::CreateAsync(random_stream);
// Subresources at index higher than 0 crash at this point with the error: 0x88982F50 : 'The component cannot be found.'.

// The subresource at index 0 doesn't crash at the previous line, so I turn it into a SoftwareBitmap so that I can show it in XAML.
auto new_software_bitmap = co_await decoder.GetSoftwareBitmapAsync();

new_software_bitmap = Windows::Graphics::Imaging::SoftwareBitmap::Convert(
    new_software_bitmap,
    Windows::Graphics::Imaging::BitmapPixelFormat::Bgra8,
    Windows::Graphics::Imaging::BitmapAlphaMode::Premultiplied);

Windows::UI::Xaml::Media::Imaging::SoftwareBitmapSource new_bitmap_source;
co_await new_bitmap_source.SetBitmapAsync(new_software_bitmap);
[...]

Проблема начинается, когда япопытайтесь изменить current_index на 1 или выше.Я получаю ошибку 0x88982F50 : 'The component cannot be found.' в строке, где я пытаюсь создать BitmapDecoder.

1 Ответ

0 голосов
/ 07 марта 2019

Вы уверены, что исходное изображение содержит мипмапы?API, который вы вызываете, не генерирует автоматически mipmaps:

"Эти функции создают ресурс текстуры и возвращают данные инициализации в ddsData, на который указывает вектор подресурсов. Они не поддерживаютгенерация mipmaps, но поддерживает резервирование места для mipmaps. "

Просмотрите содержимое возвращенных подресурсов, чтобы увидеть, что там.

...