6 外部纹理源
本部分仅提供简单的ExtermalTextureSource和ExtermalTextureSourceManager类的介绍,以及插件工作方式。更多参考ffmpegVideoSystem插件
什么是外部纹理源
传统的图片文件如png\bmp\jpeg等Ogre已经做了处理。其它的纹理格式来源,如mpeg\avi\flash、用户自定义格式等Ogre没有解析的内容都可以作为外部纹理源。
ExternalTextureSource类
编写外部纹理源插件需要继承ExternalTextureSource类。该类通过StringInterface接口提供了非常有限的功能。最常用的参数可通过类提供的接口或者基类StringInterface接口设置。提供StringInterface接口主要是为了方便在插件继承时增加新的参数类型。
默认的参数包括:
filename 插件加载的文件名
play_mode 播放模式,包括play/loop/pause
set_T_P_S 设置纹理所在技术、通道、纹理(state),默认”0 0 0”
frames_per_second 帧数,只能是整数
基类必须继承的接口包括:
virtual bool initialise() = 0; //初始化
virtual void shutDown() = 0; //销毁
//创建纹理(最主要的接口)
virtual void createDefinedTexture( const String& sMaterialName,
const String& groupName = ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME) = 0;
//销毁纹理
virtual void destroyAdvancedTexture( const String& sTextureName,
ExternalTextureSourceManager类
用于注册和管理已加载的插件,以及辅助通过脚本创建纹理源纹理。同时也是访问纹理源插件的接口
使用ExternalTextureSourceManager创建纹理的步骤:
1、注册:通过plugins.cfg加载插件,插件加载时应调用setExternalTextureSource注册自己
2、创建纹理:
调用setCurrentPlugin()设置当前使用的纹理插件
调用getCurrentPluin()->setParameter设置参数
调用getCurrentPluin()->createDefinedTexure创建纹理
类同时提供destroyAdvancedTexture方法删除纹理,该方法对所有加载的纹理源插件广播纹理名,对应的插件应在ExternalTextureSource::destroyAdvancedTexture接口做清除动作。
纹理源材质脚本
material Example/MyVideoExample
{ technique { pass {
texture_unit{
texture_source video //纹理源类型
{
filename mymovie.mpeg //文件名, 默认参数
play_mode play //播放参数,默认参数
sound_mode on //插件扩展参数
}
}
} } }
ffmpegVideoSystem插件配置示例,即使用单独的texture_source指定纹理源各参数
处理流程
ffmpegVideoSystem插件流程示意图,其它插件类似
附:
编写外部纹理源插件仅需要继承ExternalTextureSource类,并实现其createDefinedTexture接口。典型情况下,Ogre在解析材质脚本时调用插件的createDefinedTexture接口创建纹理。插件在加载时通过ExternalTextureSourceManager::setExternalTextureSource接口注册
Ogre不提供刷新等控制,对于ffmpegVide插件或其它类似动态插件,需要插件自己处理刷新,典型的办法是继承FrameListener并加载到OgreRoot监听队列,在frameStarted方法中更新纹理。