coco2dx繪製到紋理

2021-06-28 17:34:15 字數 3047 閱讀 4080

為了完成一些特效(比如,角色狂暴,但雙腳又被石化),有時需要使用gl es的的紋理緩衝(**未整理):

void mysprite::mydraw(const cocos2d::mat4 &transform)

glint viewport[4];

glgetintegerv(gl_viewport, viewport);

glviewport(0, 0, contentsize.width, contentsize.height);// 一定不能漏掉

gluint framebuffer[2];

gluint frametexture[2];

glgenframebuffers(2, framebuffer);

glgentextures(2, frametexture);

// 下面將紋理this->_texture->getname()的狂暴效果繪製到紋理frametexture[0]中

// function usingframetexture()

cocos2d::gl::bindtexture2dn(textureunit, frametexture[0]);//textureunit:gl es中使用的是gl_texture0、gl_texture1等等,在cocos2d::gl中使用的是索引,即gl_texture***-gl_texture0

glteximage2d(gl_texture_2d, 0, gl_rgba, contentsize.width, contentsize.height, 0, gl_rgba, gl_unsigned_byte, nullptr);

glbindframebuffer(gl_framebuffer, framebuffer[0]);

glframebuffertexture2d(gl_framebuffer, gl_color_attachment0, gl_texture_2d, frametexture[0], 0);

if (glcheckframebufferstatus(gl_framebuffer) != gl_framebuffer_complete)//幀緩衝不完整,無法繼續

glclearcolor(0, 0, 0, 0);

glclear(gl_color_buffer_bit);

gldisable(gl_depth_test);

// 此處使用狂暴著色器,繪畫狂暴效果,使用的紋理為this->_texture->getname()

// ...

// 至此,狂暴效果將被繪製到紋理frametexture[0]中

// 下面將紋理frametexture[0]的腳部石化效果繪製到紋理frametexture[1]中(還應當用到模板緩衝,此處省略了)

if (!usingframetexture(frametexture[1], ...)) break;

// 此處使用石化著色器,繪畫石化效果,使用的紋理為frametexture[0]

// ...

// 至此,石化效果將被繪製到紋理frametexture[1]中

// 下面將紋理frametexture[1]繪製主緩衝

glviewport(viewport[0], viewport[1], viewport[2], viewport[3]);// 恢復視區

glbindframebuffer(gl_framebuffer, 0);

static cocos2d::glprogram* program = cocos2d::glprogramcache::getinstance()->getglprogram(cocos2d::glprogram::shader_name_position_texture_color_no_mvp);

program->use();

cocos2d::v3f_c4b_t2f_quad realquad = this->_quad;

transform.transformpoint(&realquad.bl.vertices);

transform.transformpoint(&realquad.br.vertices);

transform.transformpoint(&realquad.tl.vertices);

transform.transformpoint(&realquad.tr.vertices);

myspritedrawhelper().setup(&realquad, 1, nullptr, 0);

cocos2d::gl::blendfunc(gl_one, gl_one_minus_src_alpha);

glblendequation(gl_func_add);

cocos2d::gl::bindtexture2dn(textureunit, frametexture[1]);

static gluint sampler0location = program->getuniformlocation(cocos2d::glprogram::uniform_name_sampler0);

gldrawarrays(gl_quad_strip, 0, 4);

// 由於cocos2dx的緩衝機制,此處需要恢復program的sampler0location

program->setuniformlocationwith1i(sampler0location, 0);

myspritedrawhelper().unsetup();

#if cc_enable_gl_state_cache

cocos2d::gl::bindtexture2dn(textureunit, -1);//不知道為何,不加本句的話會導致紋理錯誤(cocos2dx的bug?)

#endif

gldeleteframebuffers(2, framebuffer);

gldeletetextures(2, frametexture);

} while (false);//用do-while是為了在發生錯誤時可以立即中斷操作,然後執行後續的操作(比如清理)

// ...

check_gl_error_debug();

}

coco2d x怎樣建立project

不知道coco2d x從那個版本號開始用python建立project,一句話搞定,確實省去了好多麻煩。首先定位到coco2d x的資料夾到cocos2d x 2.2.3 cocos2d x 2.2.3 tools project creator。前提你要裝python軟體。python是一種物件導...

coco2d x 實現風雪飄動效果

專案中的天氣系統,需要用到風雪效果,這時模擬的風雪效果,在3d效果上,還有點不足,就是雪花的消失點應該按照雪花的縮放係數算出它該消失的位置。目前是用的在螢幕外面就從新移到原始位置。上個效果圖 具體實現 先定義幾個雪花飄的方向 先定義幾個雪花的飄動方向 enum 初始化雪花 void gtwind s...

Coco2d x從Win32移植到Android

安裝vs2008 解壓cocos2d x,執行install templates msvc.bat 安裝cocos2d x的模版,新建工程的時候就會可以選擇新建cocosd x的工程 找到 cocos2d win32.vc2008.sln,開啟,在裡面建自己的工程就可以,有時候可能需要引用 執行緒或...