深入分析Cocos2dx 20中的纹理Word文档格式.docx
- 文档编号:22007242
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:99
- 大小:180.10KB
深入分析Cocos2dx 20中的纹理Word文档格式.docx
《深入分析Cocos2dx 20中的纹理Word文档格式.docx》由会员分享,可在线阅读,更多相关《深入分析Cocos2dx 20中的纹理Word文档格式.docx(99页珍藏版)》请在冰豆网上搜索。
我们来看一下cocos2d-x中的libcocos2d库,其下有许多目录,找到textures展开,可以看到有CCTexture2D,CCTextureAtlas,CCTextureCache,CCTexturePVR四个类。
这四个类的功能分别是:
CCTexture2D:
纹理,即图片加载入内存后供CPU和GPU操作的贴图对象。
CCTexturePVR:
处理PVR文件生成纹理的类,提示:
大家可以用它解析愤怒的小鸟中的图片。
CCTextureCache:
纹理管理器,负责加载图片并对生成的纹理进行管理。
通过“字典”来进行快速的查询。
CCTextureAtlas:
纹理块管理器,如果图片是由多个小图块组成的,则纹理块管理器用来存储这些小图块的相关信息,以方便绘制相应图块。
为了让大家更好的学习纹理,在讲解纹理的代码之前我已经先给大家分析了本章用到的两个功能类:
CCImage和CCDictionary。
这两个类分别在纹理模块中担任加载图片和管理纹理指针的作用。
希望大家先顶一下这两篇贴子之后再开始下面的代码学习,你一定会感到非常容易。
一.CCTexture2D:
好,咱们现在开始看CCTexture2D:
[cpp]
viewplaincopy
1.#ifndef
__CCTEXTURE2D_H__
2.#define
3.
4.#include
<
string>
5.#include
"
cocoa/CCObject.h"
6.#include
cocoa/CCGeometry.h"
7.#include
ccTypes.h"
8.
9.//Cocos2d命名空间
10.NS_CC_BEGIN
11.//需要用到CCImage,这里声明一下。
12.class
CCImage;
13.
14.//纹理格式:
即每个纹理中的像素单位分别是怎么为颜色值进行实际内存分配的。
这个非常重要,我们在进行游戏开发的过程中,会常常与各种图片类型打交通。
每种图片往往也有各自的像素格式。
但当它们一旦加载到游戏中后,就会根据我们的要求变成以下某种类型的纹理。
不同的纹理格式所占据的内存大小可能不同,我们要根据实际情况和需求来选择相应的纹理格式。
比如我们用RGBA8888纹理格式来创建纹理,它占据的内存容量很大,如果我们要显示的纹理中没有ALPHA值,那就不应该使用带ALPHA通道的纹理格式。
我们就可以改成RGB565像素格式。
15.
16.typedef
enum
{
17.
18.
//32位真彩色,最真但最耗内存
19.
kCCTexture2DPixelFormat_RGBA8888,
20.
//24位真彩色,去掉了ALPHA通道
21.
kCCTexture2DPixelFormat_RGB888,
22.
//16位色,将RGB压缩在一个字中。
绿色多了1位,因为人眼对绿色更敏感。
23.
kCCTexture2DPixelFormat_RGB565,
24.
//8位色,只存ALPHA值,做遮罩图用
25.
kCCTexture2DPixelFormat_A8,
26.
//8位色,只存灰度或者强度值,做灰度图用
27.
kCCTexture2DPixelFormat_I8,
28.
//16位色,只存ALPHA值与强度值,双功能
29.
kCCTexture2DPixelFormat_AI88,
30.
//16位色,RGBA四通道各占4位。
31.
kCCTexture2DPixelFormat_RGBA4444,
32.
//16位色,RGB三通道各占5位,多1位留做ALPHA镂空使用
33.
kCCTexture2DPixelFormat_RGB5A1,
34.
//
PVR的PVRTC4压缩格式
35.
kCCTexture2DPixelFormat_PVRTC4,
36.
PVRTC的PVRTC2压缩格式
37.
kCCTexture2DPixelFormat_PVRTC2,
38.
39.
//默认格式RGBA8888
40.
kCCTexture2DPixelFormat_Default
=
41.
42.
为了兼容性而保留的枚举值
43.
kTexture2DPixelFormat_RGBA8888
44.
kTexture2DPixelFormat_RGB888
45.
kTexture2DPixelFormat_RGB565
46.
kTexture2DPixelFormat_A8
47.
kTexture2DPixelFormat_RGBA4444
48.
kTexture2DPixelFormat_RGB5A1
49.
kTexture2DPixelFormat_Default
50.
51.}
CCTexture2DPixelFormat;
52.
53.//需要使用Shader代码片段,这里声明一下
54.class
CCGLProgram;
55.
56.//定义了纹理的一些参数
57.typedef
struct
_ccTexParams
58.
GLuint
minFilter;
//纹理过滤器:
缩小过滤器
59.
magFilter;
放大过滤器
60.
wrapS;
//横向纹理寻址模式
61.
wrapT;
//纵向纹理寻址模式
62.}
ccTexParams;
63.
64.
65.//
CCTexture2D类可以方便的从图片,文本或raw数据文件中创建OpenGL所用贴图,创建的贴图会自动转为2的幂次方大小,所以要注意对于贴图坐标的影响。
66.
67.class
CC_DLL
CCTexture2D
:
public
CCObject
68.{
69.public:
70.
//构造
71.CCTexture2D();
72.//析构
73.
virtual
~CCTexture2D();
74.
//取得纹理的描述
75.
const
char*
description(void);
76.
77.
//释放数据
78.void
releaseData(void
*data);
79.
//保存数据
80.
void*
keepData(void
*data,
unsigned
int
length);
81.
82.
//由数据指针和指定的像素格式,图片宽高,来生成OpenGL贴图。
83.
bool
initWithData(const
data,
CCTexture2DPixelFormat
pixelFormat,
pixelsWide,
pixelsHigh,
CCSize&
contentSize);
84.
85.//在指定的位置绘制贴图
86.void
drawAtPoint(const
CCPoint&
point);
87.
//纹制贴图上的一个图像块
88.void
drawInRect(const
CCRect&
rect);
89.
90.
//由CCImage指针生成OpenGL贴图
91.
initWithImage(CCImage
*
uiImage);
92.
93.
//由一个字符串生成OpenGL贴图。
94.
initWithString(const
char
*text,
dimensions,
CCTextAlignment
hAlignment,
CCVerticalTextAlignment
vAlignment,
*fontName,
float
fontSize);
95.
//由一个字符串和指定的字体与大小生成OpenGL贴图
96.
97.
98.//如果支持PVR的压缩格式
99.#ifdef
CC_SUPPORT_PVRTC
100.
//由一个PVR压缩格式的数据生成OpenGL贴图
101.
initWithPVRTCData(const
void
level,
bpp,
hasAlpha,
length,
pixelFormat);
102.#endif
103.
104.
//从普通PVR文件生成OpenGL贴图
105.
initWithPVRFile(const
file);
106.
107.
//设置贴图参数
108.
setTexParameters(ccTexParams*
texParams);
109.
110.
//设置为抗锯齿的贴图过滤方式(线性过滤)
111.
setAntiAliasTexParameters();
112.
113.
//设置为非抗锯齿的贴图过滤方式(最近点采样)
114.
setAliasTexParameters();
115.
116.
117.
//生成多级贴图:
由图片数据生成一系列尺寸为2的幂次方直至当前贴图大小的贴图。
系统会根据距离自动选择纹理图片。
可以解决大图片显示在小空间时的闪烁问题。
118.
generateMipmap();
119.
120.
//取得像素格式名称
121.
stringForFormat();
122.
123.
//返回当前贴图色深,即每个像素占多少位
124.
bitsPerPixelForFormat();
125.
126.//通过参数贴图格式返回纹理色深
127.unsigned
bitsPerPixelForFormat(CCTexture2DPixelFormat
format);
128.
129.
130.
//静态函数,用于设置默认带ALPHA通道的贴图像素格式。
则图片创建为贴图时,如果有ALPHA通道,则生成此默认贴图像素格式。
131.
static
setDefaultAlphaPixelFormat(CCTexture2DPixelFormat
132.
133.
//静态函数,取得默认带ALPHA通道的贴图像素格式。
134.
defaultAlphaPixelFormat();
135.
136.
//静态函数,设置载入PVR时是否开启ALPHA渐变,默认不开启,则ALPHA值只有是与否,无渐变。
137.
PVRImagesHavePremultipliedAlpha(bool
haveAlphaPremultiplied);
138.
139.
//取得图片大小(以像素为单位)
140.
getContentSizeInPixels();
141.
//是否有ALPHA渐变值
142.bool
hasPremultipliedAlpha();
143.//是否有多级贴图
144.
hasMipmaps();
145.private:
146.
//加载一个带ALPHA渐变的图片生成OpenGL贴图
147.
initPremultipliedATextureWithImage(CCImage
image,
pixelsHigh);
148.
149.
//ALPHA渐变开关
150.
m_bPVRHaveAlphaPremultiplied;
151.
152.
//贴图格式变量及get接口
153.
CC_PROPERTY_READONLY(CCTexture2DPixelFormat,
m_ePixelFormat,
PixelFormat)
154.
//贴图宽度及get接口
155.
CC_PROPERTY_READONLY(unsigned
int,
m_uPixelsWide,
PixelsWide)
156.
//贴图高度及get接口
157.
m_uPixelsHigh,
PixelsHigh)
158.
159.
//OpenGL贴图索引及get接口
160.
CC_PROPERTY_READONLY(GLuint,
m_uName,
Name)
161.
162.
//横向贴图坐标终点。
因为图片如果不是2的幂次方,图片大小会小于贴图的大小,贴图一定是2的幂次方嘛,这时候横向的贴图坐标终点不是1.0。
163.
CC_PROPERTY(GLfloat,
m_fMaxS,
MaxS)
164.
//纵向贴图坐标终点。
165.
m_fMaxT,
MaxT)
166.
//图片大小及get接口
167.
CC_PROPERTY_READONLY(CCSize,
m_tContentSize,
ContentSize)
168.
169.
ALPHA渐变开关
170.
m_bHasPremultipliedAlpha;
171.
多级纹理开关
172.
m_bHasMipmaps;
173.
174.
//Shader代码片段指针
175.
CC_PROPERTY(CCGLProgram*,
m_pShaderProgram,
ShaderProgram);
176.};
177.
178.NS_CC_END
179.
180.#endif
//__CCTEXTURE2D_H__
再来看CCTexture2D.cpp:
1.#include
CCTexture2D.h"
2.#include
ccConfig.h"
3.#include
ccMacros.h"
CCConfiguration.h"
platform/platform.h"
platform/CCImage.h"
CCGL.h"
8.#include
support/ccUtils.h"
9.#include
platform/CCPlatformMacros.h"
10.#include
textures/CCTexturePVR.h"
11.#include
CCDirector.h"
12.#include
shaders/CCGLProgram.h"
13.#include
shaders/ccGLStateCache.h"
14.#include
shaders/CCShaderCache.h"
15.//这里定义是否使用可变纹理
16.#if
CC_ENABLE_CACHE_TEXTURE_DATA
#include
CCTextureCache.h"
18.#endif
19.//Cocos2d-x命名空间
20.NS_CC_BEGIN
23.//静态全局的默认贴图像素格式。
缺省为kCCTexture2DPixelFormat_Default,即RGBA8888。
24.static
g_defaultAlphaPixelFormat
kCCTexture2DPixelFormat_Default;
26.//静态全局的PVR是否有ALPHA渐变的开关变量,默认为否。
27.static
PVRHaveAlphaPremultiplied_
false;
29.//构造函数。
30.CCTexture2D:
CCTexture2D()
31.:
m_uPixelsWide(0)
32.,
m_uPixelsHigh(0)
33.,
m_uName(0)
34.,
m_fMaxS(0.0)
35.,
m_fMaxT(0.0)
36.,
m_bHasPremultipliedAlpha(false)
37.,
m_bHasMipmaps(false)
38.,
m_bPVRHaveAlphaPremultiplied(true)
39.,
m_pShaderProgram(NULL)
40.{
41.}
42.//析构
43.CCTexture2D:
~CCTexture2D()
44.{
45.//如果使用可变纹
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 深入分析Cocos2dx 20中的纹理 深入 分析 Cocos2dx 20 中的 纹理