查看: 1868|回复: 3

请教 播放Gif动画出现花屏

[复制链接]

该用户从未签到

发表于 2009-12-9 09:05:37 | 显示全部楼层 |阅读模式
本帖最后由 indif 于 2009-12-9 09:09 编辑

加载一张Gif动画图片,贴在一个Quad上渲染,并播放Gif动画,在打开alpha混合或alpha测试的情况下会出现如下图的花屏现象。
1.jpg
通过暂停和继续播放,发现第一帧的gif图片是好的,其他帧都会出现花屏,第一帧的渲染效果如下图。
2.jpg
并且,当关闭alpha混合和alpha测试时,没有出现花屏,因此猜测应该是gif读取时除第一帧以外的其他帧图像像素alpha值有问题。
请问制作这样的gif图片时有没有什么特殊要求?我在网上下载的一些gif播放正常,一些会出现这样的花屏。

该用户从未签到

发表于 2009-12-9 11:17:53 | 显示全部楼层
一个有趣的事实是,我在开发osgdb_gif的动态播放功能时,并没有指定Alpha值,而是统一使用0xff。并不是因为疏忽,而是GIF89格式中根本就不会存储Alpha值~~

因此“Alpha设置不正确”这句话也就无从说起了。也许是您的融混方式或者别的什么有些问题?

该用户从未签到

 楼主| 发表于 2009-12-9 11:38:50 | 显示全部楼层
  1. static void
  2. decode_row(GifFileType * giffile,
  3. unsigned char * buffer,
  4. unsigned char * rowdata,
  5. int x, int y, int len,
  6. int transparent)
  7. {
  8. GifColorType * cmentry;
  9. ColorMapObject * colormap;
  10. int colormapsize;
  11. unsigned char col;
  12. unsigned char * ptr;
  13. y = giffile->SHeight - (y+1);
  14. ptr = buffer + (giffile->SWidth * y + x) * 4;

  15. colormap = (giffile->Image.ColorMap
  16. ? giffile->Image.ColorMap
  17. : giffile->SColorMap);
  18. colormapsize = colormap ? colormap->ColorCount : 255;

  19. while (len--)
  20. {
  21. col = *rowdata++;
  22. /* just in case */
  23. if (col >= colormapsize) col = 0;

  24. if ( col == transparent )
  25. {
  26. // keep pixels of last image if transparent mode is on
  27. // this is necessary for GIF animating
  28. ptr += 3;
  29. }
  30. else
  31. {
  32. cmentry = colormap ? &colormap->Colors[col] : NULL;
  33. if (cmentry)
  34. {
  35. *ptr++ = cmentry->Red;
  36. *ptr++ = cmentry->Green;
  37. *ptr++ = cmentry->Blue;
  38. }
  39. else
  40. {
  41. *ptr++ = col;
  42. *ptr++ = col;
  43. *ptr++ = col;
  44. }
  45. }
  46. *ptr++ = (col == transparent ? 0x00 : 0xff);
  47. }
  48. }
复制代码
最后一句是对像素alpha分量赋值,这样就有不透和全透两种情况
而transparent参数来自于gif文件

  1. case EXTENSION_RECORD_TYPE:
  2.                 /* Skip any extension blocks in file: */
  3.                 if (DGifGetExtension(giffile, &extcode, &extension) == GIF_ERROR)
  4.                 {
  5.                     giferror = ERR_READ;
  6.                     delete [] buffer;
  7.                     delete [] rowdata;
  8.                     return NULL;
  9.                 }
  10.                 /* transparent test from the gimp gif-plugin. Open Source rulez! */
  11.                 else if (extcode == 0xf9)
  12.                 {
  13.                     if (extension[0] >= 4 && extension[1] & 0x1) transparent = extension[4];
  14.                     else transparent = -1;
  15.                     delaytime = (extension[3]<<8)+extension[2];    // minimum unit 1/100s, so 8 here means 8/100s
  16.                 }
复制代码
以上是osgdb_gif工程(2.8.2)中的代码,我不知道GIF89是否有存储alpha值,但从这段代码来看,应该是每帧图像有一个字段存储了透明色,代码中正是根据这个“透明色”来为alpha通道赋值的

该用户从未签到

发表于 2009-12-9 12:13:58 | 显示全部楼层
哦,想起来了,这段好像是2.2之后我修改的;之前的代码是没有判断的。

那就不知道了,也许您的gif图片格式与此有别~~您可以自己跟踪代码检查一下,然后提交您的修改意见~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表