一、声明

笔者以cocos2d框架cocos2d-x-3.3rc0版本的源码做分析。本文为笔者原创,允许转载和分享,只要注明文章出处即可。

二、简介

Texture2D类简介

Texture2D类允许开发者用图像、文本信息和简单的数据来创建OpenGL2D纹理。被创建的纹理拥有两个维度。根据开发者创建Texture2D对象方式的不同,实际图像的尺寸可能比生成的纹理的尺寸要小,而且纹理的内容是倒置的。

像素格式

在计算机图形学中,人们用每个像素在内存中的总位数以及分别存储红、蓝、绿和alpha(阿尔法通道)分量的位数来定义一个像素格式。像素格式描述了像素数据在内存中的存储格式,也定义了像素在内存中的编码方式。

在Texture2D类中,用一个枚举类型 PixelFormat 来表示不同的像素格式。下面是像素格式枚举类型的定义。

enum class PixelFormat{//! auto detect the type
        AUTO,//! 32-bit texture: BGRA8888
        BGRA8888,//! 32-bit texture: RGBA8888
        RGBA8888,//! 24-bit texture: RGBA888
        RGB888,//! 16-bit texture without Alpha channel
        RGB565,//! 8-bit textures used as masks
        A8,//! 8-bit intensity texture
        I8,//! 16-bit textures used as masks
        AI88,//! 16-bit textures: RGBA4444
        RGBA4444,//! 16-bit textures: RGB5A1
        RGB5A1,//! 4-bit PVRTC-compressed texture: PVRTC4
        PVRTC4,//! 4-bit PVRTC-compressed texture: PVRTC4 (has alpha channel)
        PVRTC4A,//! 2-bit PVRTC-compressed texture: PVRTC2
        PVRTC2,//! 2-bit PVRTC-compressed texture: PVRTC2 (has alpha channel)
        PVRTC2A,//! ETC-compressed texture: ETC
        ETC,//! S3TC-compressed texture: S3TC_Dxt1
        S3TC_DXT1,//! S3TC-compressed texture: S3TC_Dxt3
        S3TC_DXT3,//! S3TC-compressed texture: S3TC_Dxt5
        S3TC_DXT5,//! ATITC-compressed texture: ATC_RGB
        ATC_RGB,//! ATITC-compressed texture: ATC_EXPLICIT_ALPHA
        ATC_EXPLICIT_ALPHA,//! ATITC-compresed texture: ATC_INTERPOLATED_ALPHA
        ATC_INTERPOLATED_ALPHA,//! Default texture format: AUTODEFAULT = AUTO,NONE = -1};

阿尔法通道 alpha

alpha是指一张图片的透明度和半透明度。阿尔法通道的值由像素值的某几位表示,比如说,一个16位像素可能使用5位保存红色、5为保存蓝色、5位保存绿色,以及最后一位保存阿尔法通量。这时候alpha的值只有1和0,意味着纹理要么透明,要么不透明。

阿尔法通道除了能够表示图形的透明度外,还关系到不同像素颜色融合的效果。

三、源码详解

笔者比较支持从源代码中寻找寻找框架接口的使用方法。笔者会在本文中通过家少cocos2d源代码来介绍如何将一个图形资源文件加载成为Texture2D对象。

Texture2D纹理能够用于生成精灵,接下来看一下Sprite类中运用Texture2D的例子。

bool Sprite::initWithFile(const std::string &filename, const Rect& rect)
{CCASSERT(filename.size()>0, "Invalid filename");Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);if (texture){return initWithTexture(texture, rect);}// don't release here.// when load texture failed, it's better to get a "transparent" sprite then a crashed program// this->release();return false;
}

上面这个函数中,Sprite类能够利用图像文件名和一个裁剪矩阵生成Texture2D纹理,从而生成精灵。生成纹理的函数是 Director::getInstance()->getTextureCache()->addImage(filename). 下面看一下这些函数的定义。

TextureCache* Director::getTextureCache() const
{return _textureCache;
}

//texture cache belongs to this directorTextureCache *_textureCache;

可见,在Director类中有一个TextureCache类型的 _textureCache 成员变量。TextureCache类中的addImage函数能够将一个图形文件加载成为Texture2D纹理。下面看addImage函数的定义。

/** Returns a Texture2D object given an filename.* If the filename was not previously loaded, it will create a new Texture2D*  object and it will return it. It will use the filename as a key.* Otherwise it will return a reference of a previously loaded image.* Supported image extensions: .png, .bmp, .tiff, .jpeg, .pvr*/Texture2D* addImage(const std::string &filepath);

从addImage函数的声明中可以知道,addImage函数能够将给定文件名的图形文件加载成纹理。从中也可以看出TextureCache类的设计其实就是为了减少因生成纹理而多次多资源文件加载造成CPU和内存的开销。对于已经加载过的图形资源文件,TextureCache类不会再次加载,而是之间返回对资源文件的引用。

值得注意的一点是,开发者不用自行创建TextureCache对象,Director对形象持有一个TextureCache对象。

四、总结

笔者在本文中简单介绍了像素和阿尔法通量等一些计算机图形学的简单概念,以及跟踪源码寻找在cocos2d开发中如何将一个图形资源文件加载成纹理。下面将生成纹理的接口在总结一下。

Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);

转载于:https://www.cnblogs.com/chenshi/p/4095827.html

Cocos2d之Texture2D类详解之将文件加载成Texture2D对象相关推荐

  1. Cocos2d之Node类详解之节点树(二)

    一.声明 本文属于笔者原创,允许读者转载和分享,只要注明文章来源即可. 笔者使用cocos2d框架的cocos2d-x-3.3rc0版本的源代码做分析.这篇文章承接上篇<Cocos2d之Node ...

  2. win7下计划任务schtasks使用详解及错误:无法加载列资源的解决方法1

    win7下计划任务schtasks使用详解及"错误:无法加载列资源"的解决方法1 2011-12-10 20:33 schtasks 命令简述: 安排命令和程序,使其定期运行或在指 ...

  3. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  4. Cocos2d之Action类详解

    一.声明 文章中使用到的cocos2d的源代码的版本是cocos2d-x-3.3rc0. 二.主要内容 [Action类简介] 在cocos2d中,Action类是所有动作的基类.Action类继承了 ...

  5. Spring启动流程(原理)详解--结合web.xml加载配置分析 转

    https://blog.csdn.net/a1036645146/article/details/98617303

  6. Google Map API使用详解(七)——加载Google Map API URL的详细解读

    谷歌地图的API类库是通过script标签导入的,形式如下: <script src="http://ditu.google.com/maps?file=api&hl=zh-C ...

  7. 《Windows驱动开发技术详解》之编程加载NT式驱动

    之前我们加载驱动都是利用INSTDRV这个应用,其原理是在注册表中写入相应的字段,这一节我们手动编写代码去加载驱动,其原理类似: 设备驱动程序的动态加载主要由服务控制管理程序(Service Cont ...

  8. Web.xml配置详解之context-param (加载spring的xml,然后初始化bean看的)

    http://www.cnblogs.com/goody9807/p/4227296.html(很不错啊) 容器先加载spring的xml,然后初始化bean时,会为bean赋值,包括里面的占位符 转 ...

  9. Android:ViewPager详解(异步网络加载图片,带图片缓存,并带导航小圆点)

    android 应用中,如欢迎指引页面, 和图片轮播功能, 或者更多的内容在一页显示不了,要分成多个页面,这时候viewpager是很好用的. 首先看下效果: 下面是一个例子,带异步网络加载图片,并带 ...

最新文章

  1. oracle如何查看表的字段是否存在,Oracle删除表、字段之前判断表、字段是否存在...
  2. 如何查看oracle数据库集群哪个节点正在使用,windows oracle 怎么查看集群状态
  3. AJAX实现图片文件上传
  4. Oracle中限定日期,Oracle 日期的一些简单使用
  5. SAP Fiori里的List是如何做到懒加载Lazy load的
  6. C语言多项式乘法模拟,急!!!!c语言:求n次多项式的加法和乘法
  7. 代码质量管理工具】——sonar
  8. 勘误:EOS资源抵押退还
  9. 【FLink-未解决】FLink Mertic 冲突 导致 任务挂掉 Namecollision Group allready contains a mertics
  10. 海报素材模板|超好看的新年素材,你真的不来看一看吗?
  11. python cnn程序_python cnn训练(针对Fashion MNIST数据集)
  12. 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)
  13. Halcon匹配助手
  14. python ——时间间隔
  15. MongoDB一篇从入门到实战
  16. 杰理之探测芯片最高稳定运行频率【篇】
  17. nbextensions安装完不显示,404 GET /static/components/marked/lib/marked.js?v=20230331152041
  18. 数据结构----各种排序方法总结
  19. python获取决策树的叶节点与深度
  20. 生命不息,折腾不止—小黑升win10

热门文章

  1. 打造自己的树莓派监控系统1--CPU监控-matplotlib显示数据
  2. html text alt,HTML alt text for image maps
  3. ios键盘done中文_关于IOS键盘的一些调用心得与坑
  4. comsat java_java-com.thoughtworks.xstream.converters.ConversionExce...
  5. Java新旧代码的比较_比较java新旧I/O的性能——以复制大文件为例
  6. mac玩rust用什么画质_玩七日杀Steam游戏用什么加速器?电狐加速器
  7. java不同的数据源如何处理_java – 如何在不同的数据源上创建两个类之间的关系?...
  8. ffmpeg库编译加文字_使用ffmpeg库编译错误及解决办法
  9. excel如果包含某个字就显示_Excel公式基础知识
  10. el replace 表达式_EL表达式截取字符串 各种字符串操作的方式全解 泽0715新浪博客...