可以重新采样HTMLVideoElement,以便随时间将不同的帧添加到纹理中。
例如,如https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Animating_textures_in_WebGL
所示然而,当将动画gif加载到HTMLImageElement时,重新采样不会显示更新的纹理。即使图像安装在dom上并且不同的帧显示在该副本上也是如此。
是否有标准方法在webgl中显示动画gif,或者必须在运行时以某种方式将其重写为spritesheet(或一系列纹理)?
答案 0 :(得分:0)
GIF不会使用WebGL(或常规画布)自动设置动画,并且没有标准的方法来执行此操作。
与视频元素相反,GIF图像仅通过touchstart
绘制第一个帧,而绘制视频元素将绘制当前帧。这部分是因为我们实际上无法通过API访问任何图像的帧(这也适用于动画PNG文件,即APNG),动画图像将仅作为由浏览器自行决定的内部过程处理并且只有在DOM中。
使用视频元素虽然我们可以访问“框架”,也就是通过drawImage()
的时间,所以它意味着我们想要处理我们在当前时间看到或存在的内容。
您必须手动为GIF图像设置动画。这意味着您必须首先将每个帧提取为单独的图像/缓冲区,然后以您选择的速率显示它们。浏览器在这里没有帮助,但您可以通过手动解析文件格式来完成此操作。
当然,这可能有点单调乏味,但幸运的是,那里的人已经完成了所有的提升和努力工作。例如gifuct(我自己没有测试过,但也有其他测试)允许你从GIF中提取每一帧
然后将从中获得的每个帧渲染到帧缓冲区中,并以您选择的帧速率上传到GPU。
或者:
作为一个无耻的插件,如果你应该考虑APNG:我已经apng-parser为APNG文件做了同样的事情。
我的建议虽然是将GIF / APNG转换为视频文件,该视频文件为免费的,可能更小的文件提供动画功能,可以缓存和流式传输以获得长动画,减少要包含的代码和通常是单个文件来处理(您可能必须为旧版浏览器提供不同的视频格式)。 FFMpeg等免费软件可以帮助您进行转换。