為了完成一些特效(比如,角色狂暴,但雙腳又被石化),有時需要使用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,開啟,在裡面建自己的工程就可以,有時候可能需要引用 執行緒或...