深入分析Cocos2d-x 2.0中的“纹理”(4)
for(unsigned int i = 0; i < length; ++i, ++inPixel32) { *outPixel8++ = (*inPixel32 >> 24) & 0xFF; // A
if (hasAlpha && pixelFormat == kCCTexture2DPixelFormat_RGB888) { // 转换 RGBA8888 到 RGB888,同理,不再赘述 // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRRRRGGGGGGGGBBBBBBBB" inPixel32 = (unsigned int*)image->getData(); tempData = new unsigned char[width * height * 3]; unsigned char *outPixel8 = tempData;
for(unsigned int i = 0; i < length; ++i, ++inPixel32)
396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. } } } }
{ *outPixel8++ = (*inPixel32 >> 0) & 0xFF; // R *outPixel8++ = (*inPixel32 >> 8) & 0xFF; // G *outPixel8++ = (*inPixel32 >> 16) & 0xFF; // B }
//因为最终相应像素格式的数据都存放在 tempData 中,所以这里通过像素数据来生成 OpenGL 贴图。 initWithData(tempData, pixelFormat, width, height, imageSize); //如果是以上相应格式,则 tempData 都是新申请的内存块,则在这里释放申请的内存。 if (tempData != image->getData()) { delete [] tempData;
//取得是否有 ALPHA 渐变通道数据 m_bHasPremultipliedAlpha = image->isPremultipliedAlpha(); return true;
// 从字符串中创建 OpenGL 贴图。 //参 1:字符串 //参 2:字体名称 //参 3:字体大小 bool CCTexture2D::initWithString(const char *text, const char *fontName, float fontSize) { return initWithString(text, CCSizeMake(0,0), kCCTextAlignmentCenter, kCCVerticalTextAlignmentTop, fontName, fontSize);
// 从字符串中创建 OpenGL 贴图,可指定更多参数。 //参 1:字符串 //参 2:返回参数,代表在屏幕上占用的区域大小 //参 3:文字的横向对齐方式 //参 4:文字的纵向对齐方式 //参 5:字体名称 //参 6:字体大小 bool CCTexture2D::initWithString(const char *text, const CCSize& dimensions, CCTextAlignment hAlignment, CCVerticalTextAlignm ent vAlignment, const char *fontName, float fontSize)
430. 431. 432. 433. 434. 435. 436. 437. 438. 439.
{ //如果定义使用可变纹理 #if CC_ENABLE_CACHE_TEXTURE_DATA // cache the texture data VolatileTexture::addStringTexture(this, text, dimensions, hAlignment, vAlignment, fontName, fontSize); #endif //定义一个 CCImage 实例对象 CCImage image; //定义一个 CCImage 进行由字符串创建图片时指定的文字对齐方式的变量 eAlign CCImage::ETextAlign eAlign;
440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. }
//如果文字纵向对齐
方式为顶部对齐。 if (kCCVerticalTextAlignmentTop == vAlignment) { //根据文字横向对齐方式的不同分别对 eAlign 进行设置。 eAlign = (kCCTextAlignmentCenter == hAlignment) ? CCImage::kAlignTop : (kCCTextAlignmentLeft == hAlignment) ? CCImage::kAlignTopLeft : CCImage::kAlignTopRight; } //如果文字纵向对齐方式为居中对齐。 else if (kCCVerticalTextAlignmentCenter == vAlignment) { //根据文字横向对齐方式的不同分别对 eAlign 进行设置。 eAlign = (kCCTextAlignmentCenter == hAlignment) ? CCImage::kAlignCenter : (kCCTextAlignmentLeft == hAlignment) ? CCImage::kAlignLeft : CCImage::kAlignRight; } //如果文字纵向对齐方式为底部对齐。 else if (kCCVerticalTextAlignmentBottom == vAlignment) { //根据文字横向对齐方式的不同分别对 eAlign 进行设置。 eAlign = (kCCTextAlignmentCenter == hAlignment) ? CCImage::kAlignBottom : (kCCTextAlignmentLeft == hAlignment) ? CCImage::kAlignBottomLeft : CCImage::kAlignBottomRight; } else { //其它对齐方式不应存在,故打印错误。 CCAssert(false, "Not supported alignment format!"); } //调用 CCImage 的成员函数由字符串创建出图片数据。 if (!image.initWithString(text, (int)dimensions.width, (int)dimensions.height, eAlign, fontName, (int)fontSize)) { return false; } //再由 CCImage 实例对象来创建出 OpenGL 贴图,初始化纹理。 return initWithImage(&image);
// 在指定的位置绘制贴图。 void CCTexture2D::drawAtPoint(const CCPoint& point) { //定义贴图中图像区域的 UV 坐标。从左上至右下。 GLfloat 0.0f, coordinates[] = { m_fMaxT,
m_fMaxS,m_fMaxT, 0.0f, 0.0f,
m_fMaxS,0.0f }; //取得贴图中图像区域的宽高
485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. }
GLfloat
width = (GLfloat)m_uPixelsWide * m_fMaxS,
height = (GLfloat)m_uPixelsHigh * m_fMaxT; //定义对应的顶点坐标 GLfloat point.x, width + point.x, point.x, width + point.x, vertices[] = { point.y, point.y, height height + point.y, + point.y };
//Shader 中使用位置和纹理坐标通道。 ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords ); //后面的代码便用 Shader 进行渲染 m_pShaderProgram->use(); //设置 Shader 使用的最终结果矩阵 m_pShaderProgram->setUniformForModelViewProjectionMatrix(); //将贴图绑定 ccGLBindTexture2D( m_uName );
//将 vertices 设置为顶点位置参数 glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices); //将 coordinates 设置为顶点的纹理坐标参数 glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, coordinates); //绘制三角形,参 1 为绘图方式,参 2 为顶点起始索引,参 3 为三角形面数。 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//绘制纹理上的一个
区域。 void CCTexture2D::drawInRect(const CCRect& rect) { //定义贴图中图像区域的 UV 坐标。从左上至右下。 GLfloat 0.0f, coordinates[] = { m_fMaxT,
m_fMaxS,m_fMaxT, 0.0f, 0.0f,
m_fMaxS,0.0f }; //绘制到的区域 GLfloat vertices[] = { rect.origin.x, rect.origin.y, rect.origin.y, rect.origin.y + rect.size.height, rect.origin.y + rect.size.height, /*0.0f,*/ /*0.0f,*/ /*0.0f,*/ /*0.0f*/ };
rect.origin.x + rect.size.width, rect.origin.x, rect.origin.x + rect.size.width, //Shader 中使用位置和纹理坐标通道。
ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position …… 此处隐藏:3480字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场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(傲慢与偏见)




