Ogre源码分析与学习笔记-2 纹理

本文详细解析了Ogre引擎中纹理的继承结构,从Resource到Texture再到GLTexture,阐述了每个层级的作用及关键成员函数,揭示了纹理生命周期管理的机制。

Ogre纹理的继承关系:

 

Resource -> Texture -> GLTexture

 

1. Resource , 顾名思义就是资源, 包括纹理, 材质, 三角形网格等. Resource由ResourceManager管理, 几个核心函数:

    class _OgreExport Resource 
    {
    public:
        /** Basic constructor. 
            @warn
                Subclasses must init mName and mSize!
        */
        Resource() 
            : mIsLoaded( false ), mSize( 0 )
        { 
        }

        /** Virtual destructor. Shouldn't need to be overloaded, as the resource
            deallocation code should reside in unload()
            @see
                Resource::unload()
        */
        virtual ~Resource() 
        { 
            if( mIsLoaded )
                unload(); 
        }

        /** Loads the resource, if it is not already.
        */
        virtual void load() = 0;

        /** Unloads the resource, but retains data to recreate.
        */
        virtual void unload() {};

        /** Gets the last time the resource was 'touched'.
        */
        time_t getLastAccess(void) const 
        { 
            return mLastAccess; 
        }

        /** A method to make the resource delete itself.
            @note
                This exists because Resource objects could be created in other processes,
                and they need to be destroyed in the process that created them.
        */
        virtual void destroy()
        {
            delete this;
        }
    };

一个Resource的生命周期: Create -> Load -> Unload -> Destroy.
资源对象被构造出来时, 并不会马上把资源内容Load到内存, 而是根据需要Load, 当一个ResourceManager使用的内存达到上限时, 会主动Unload一些资源, 但不会Destroy它. Unload的根据是最后使用时间

    //-----------------------------------------------------------------------
    void ResourceManager::load(Resource *res, int priority)
    {
        res->load();
        res->touch();

        mResources.insert( ResourceMap::value_type( res->getName(), res ) );
    }


Texture类没有实现Resource类的纯虚方法, 而是加入了Texture对象的必要属性:

    class _OgreExport Texture : public Resource
    {
    public:
        /** Blits the contents of src on the texture.
            @deprecated
                This feature is superseded by the blitImage function.
            @param
                src the image with the source data
        */
        virtual void blitToTexture( 
            const Image &src, unsigned uStartX, unsigned uStartY ) = 0;

        /** Blits a rect from an image to the texture.
            @param
                src The image with the source data.
            @param
                imgRect The data rect to be copied from the image.
            @param
                texRect The rect in which to copy the data in the texture.
        */
        virtual void blitImage(
            const Image& src, const Image::Rect imgRect, const Image::Rect texRect )
        {
        }

		/** Copies (and maybe scales to fit) the contents of this texture to
			another texture. */
		virtual void copyToTexture( Texture * target ) {};

        /** Loads the data from an image.
        */
        virtual void loadImage( const Image &img ) = 0;

    protected:
        unsigned long mHeight;
        unsigned long mWidth;

        unsigned short mNumMipMaps;
        float mGamma;

        TextureType mTextureType;
		PixelFormat mFormat;
        TextureUsage mUsage;

        unsigned short mSrcBpp;
        unsigned long mSrcWidth, mSrcHeight;
        unsigned short mFinalBpp;
        bool mHasAlpha;
    };

GLTexture 继承自Texture, 并且不再被继承

    class GLTexture : public Texture
    {
    public:
        
        void load();
        void loadImage( const Image &img );
        void loadImages( const std::vector<Image> images );

        void unload();

        void createRenderTexture();

        void blitToTexture( const Image& src, 
            unsigned uStartX, unsigned uStartY );

        GLuint getGLID() const
        { return mTextureID; }

    };

它实现了最终的OpenGL可以使用的texture, 由于平台相关性, GLTexture 需要使用 GLTextureManager来产生:

    class GLTextureManager : public TextureManager
    {
    public:
        /** Creates a SDLTexture resource. 
        */
        virtual Texture* create( const String& name, TextureType texType);
     };


 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值