Ogre参考手册(十) 6 外部纹理源

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方法中更新纹理。

 

posted @ 2015-07-19 10:31  wiki3D  阅读(437)  评论(0编辑  收藏  举报