深入分析Cocos2d-x 2.0中的“纹理”(2)
再来看CCTexture2D.cpp:
[cpp] view plaincopy
11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
#include "CCDirector.h" #include "shaders/CCGLProgram.h" #include "shaders/ccGLStateCache.h" #include "shaders/CCShaderCache.h" //这里定义是否使用可变纹理 #if CC_ENABLE_CACHE_TEXTURE_DATA #include "CCTextureCache.h" #endif //Cocos2d-x 命名空间 NS_CC_BEGIN
//静态全局的默认贴图像素格式。缺省为 kCCTexture2DPixelFormat_Default,即 RGBA8888。 static CCTexture2DPixelFormat g_defaultAlphaPixelFormat = kCCTexture2DPixelFormat_Default;
//静态全局的 PVR 是否有 ALPHA 渐变的开关变量,默认为否。 static bool PVRHaveAlphaPremultiplied_ = false;
//构造函数。 CCTexture2D::CCTexture2D() : m_uPixelsWide(0) , m_uPixelsHigh(0) , m_uName(0) , m_fMaxS(0.0) , m_fMaxT(0.0) , m_bHasPremultipliedAlpha(false) , m_bHasMipmaps(false) , m_bPVRHaveAlphaPremultiplied(true) , m_pShaderProgram(NULL) { } //析构 CCTexture2D::~CCTexture2D() { //如果使用可变纹理,删除此可变纹理中的数据。 #if CC_ENABLE_CACHE_TEXTURE_DATA VolatileTexture::removeTexture(this); #endif //打印日志。 CCLOGINFO("cocos2d: deallocing CCTexture2D %u.", m_uName); //释放所用到的 Shader 代码片段 CC_SAFE_RELEASE(m_pShaderProgram); //释放 OpenGL 所用到的贴图。 if(m_uName) {
56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. } } } } } } } } }
ccGLDeleteTexture(m_uName);
//取得当前纹理的贴图像素格式。 CCTexture2DPixelFormat CCTexture2D::getPixelFormat() { return m_ePixelFormat;
//取得贴图宽度。 unsigned int CCTexture2D::getPixelsWide() { return m_uPixelsWide;
//取得贴图高度。 unsigned int CCTexture2D::getPixelsHigh() { return m_uPixelsHigh;
//取得贴图索引。 GLuint CCTexture2D::getName() { return m_uName;
//取得
图片大小(以点为单位) CCSize CCTexture2D::getContentSize() { // CC_CONTENT_SCALE_FACTOR 宏返回的是在不同屏幕下的点与像素的比率。Mac 电脑上返回 1.而使用 Retina 显示屏的 iphone 上返回 2。 CCSize ret; ret.width = m_tContentSize.width / CC_CONTENT_SCALE_FACTOR(); ret.height = m_tContentSize.height / CC_CONTENT_SCALE_FACTOR();
return ret;
//取得图片大小(以像素为单位) const CCSize& CCTexture2D::getContentSizeInPixels() { return m_tContentSize;
//取得横向的贴图坐标终点 GLfloat CCTexture2D::getMaxS() { return m_fMaxS;
//设置横向的贴图坐标终点 void CCTexture2D::setMaxS(GLfloat maxS)
101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144.
{ m_fMaxS = maxS; } //取得纵向的贴图坐标终点 GLfloat CCTexture2D::getMaxT() { return m_fMaxT; } //设置纵向的贴图坐标终点 void CCTexture2D::setMaxT(GLfloat maxT) { m_fMaxT = maxT; } //所用到的 Shader 代码片段。 CCGLProgram* CCTexture2D::getShaderProgram(void) { return m_pShaderProgram; } //设置用到的 Shader 代码片段。 void CCTexture2D::setShaderProgram(CCGLProgram* pShaderProgram) { CC_SAFE_RETAIN(pShaderProgram); CC_SAFE_RELEASE(m_pShaderProgram); m_pShaderProgram = pShaderProgram; } //释放数据 void CCTexture2D::releaseData(void *data) { free(data); } //保存数据 void* CCTexture2D::keepData(void *data, unsigned int length) { //这里只是使用 CC_UNUSED_PARAM 宏用一下 length,没什么实际功能。作者给出这个函数是预备未来供子类重载。 CC_UNUSED_PARAM(length); return data; } //是否有 ALPHA 渐变的通道数据。 bool CCTexture2D::hasPremultipliedAlpha() { return m_bHasPremultipliedAlpha; } //由数据指针创建指定大小和格式的贴图。取得创建成功后图片在贴图中的实际区域 。 bool CCTexture2D::initWithData(const void *data, CCTexture2DPixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pi xelsHigh, const CCSize& contentSize)
145. 146. 147.
{ //如果是 RGBA8888 格式或者大小正好就是 2 的幂次方。像素数据按四字节(DWORD)对齐。否则按 1 字节(BYTE)进行对齐。 if( pixelFormat == kCCTexture2DPixelFormat_RGBA8888 || ( ccNextPOT(pixelsWide)==pixelsWide && ccNextPOT(pixelsHigh)==pixe lsHigh) )
148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167.
{ glPixelStorei(GL_UNPACK_ALIGNMENT,4); } else { glPixelStorei(GL_UNPACK_ALIGNMENT,1); } //产生一个 OpenGL 的贴图索引。 glGenTextures(1, &m_uName); //将此贴图绑定为 GL_TEXTURE_2D 纹理。 ccGLBindTexture2D(m_uName); //设置 OpenGL 中的贴图的过滤参数。 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); //设置贴图的横向
纹理寻址模式为边缘截取模式。总是忽略边界。 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); //设置贴图的纵向纹理寻址模式为边缘截取模式。总是忽略边界。 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
//这里根据不同的像素格式来生成不同的 OpenGL 所用的贴图。注意:传入的宽和高在成功生成贴图后会返回实际贴图的宽和高。如果图片不是 2 的幂次方, 这个数值会改成 2 的幂次方。比如你传入的图片宽高是 148x245,则调用完成后宽高会转成 256x256。
168. 169. 170. 171. ; 172. 173. 174.
switch(pixelFormat) { case kCCTexture2DPixelFormat_RGBA8888: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)pixelsWide, (GLsizei)pixelsHigh, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
break; case kCCTexture2DPixelFormat_RGB888: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)pixelsWide, (GLsizei)pixelsHigh, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
175. 176. 177.
break; case kCCTexture2DPixelFormat_RGBA4444: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)pixelsWide, (GLsizei)pixelsHigh, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4 _4, data);
178. 179. 180.
break; case kCCTexture2DPixelFormat_ …… 此处隐藏:5265字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)




