如何访问加载到 ID3D11ShaderResourceView 中的动画 GIF 的各个帧?

How to access individual frames of an animated GIF loaded into a ID3D11ShaderResourceView?

我使用 DirectXTK 中的 CreateWICTextureFromFile() 加载动画 GIF 纹理。

ID3D11Resource* Resource;
ID3D11ShaderResourceView* View;
hr = CreateWICTextureFromFile(d3dDevice, L"sample.gif",
    &Resource, &View);

然后我将它显示在亲爱的 IMGUI 库中的 ImageButton 上:

ImGui::ImageButton((void*)View, ImVec2(width, height));

但它只显示静止图像(GIF 文件的第一帧)。

我想我必须分别给它每一帧的纹理。但我不知道怎么办。你能给我一个提示吗?

DirectX Tool Kit中的CreateWICTextureFromFile函数(a.k.a。WICTextureLoader模块中的'light-weight'版本)加载单个 2D 纹理,而不是动画 GIF 或 TIFF 等多帧图像。

DirectXTex 函数 LoadFromWICFile 可以加载多帧图像,如果你给它 WIC_FLAGS_ALL_FRAMES 标志。因为该库专注于 DirectX 资源,所以它会调整所有资源的大小以匹配第一个图像大小。

也就是说,WIC 将要 return 给你的是一堆原始帧。您必须从 WIC 查询元数据才能实际获取动画信息,并且重建起来有点复杂。我在 DirectXTex texassemble tool you can reference here 中有一个简单的实现。我专注于将动画 GIF 转换为 'flip-book' 风格的 2D 纹理数组,该数组要大得多。

The sample I referenced can be found on GitHub