粒子效果研究

粒子系統(tǒng)(Particle System)

粒子系統(tǒng)表示三維計算機圖形學(xué)中模擬一些特定的模糊現(xiàn)象的技術(shù),而這些現(xiàn)象用其它傳統(tǒng)的渲染技術(shù)難以實現(xiàn)的真實感的游戲圖形。經(jīng)常使用粒子系統(tǒng)模擬的現(xiàn)象,有火神妹、爆炸、煙、水流对省、火花、落葉浙宜、云、霧蛹磺、雪粟瞬、塵、流星尾跡或者象發(fā)光軌跡這樣的抽象視覺效果等等萤捆。

粒子系統(tǒng)的特點

  1. 整個現(xiàn)象都是由很多個獨立的圖像效果組成裙品,這些圖像效果都有自己的位置、移動軌跡等特點;
  2. 這些獨立的圖像效果組合或者疊加起來俗或,就形成了要模擬的現(xiàn)象;
  3. 獨立的圖像效果經(jīng)過一段生命周期之后會從屏幕上消失市怎,進而可以將其狀態(tài)重置并重新利用;

粒子系統(tǒng)的組成

  • 粒子類:每個單獨的粒子是整個粒子特效的一個基本組成部分,每個粒子都具有大量屬性辛慰,比如粒子圖片区匠、生命時長、方向、速度驰弄、加速度等麻汰,這些屬性能夠決定粒子的外觀及行為表現(xiàn)。
  • 粒子發(fā)射器:實際上是所有粒子的管理者戚篙,是用來進行粒子生成五鲫、粒子控制、回收粒子的管理器類岔擂。

屬性設(shè)置

粒子系統(tǒng)中可以設(shè)置的屬性如下所示位喂,不同平臺可能略有差異,但所遵守的標(biāo)準(zhǔn)相同乱灵,所以基本大同小異塑崖。

屬性設(shè)置.png

Cocos使用OpenGL混合原理對圖形進行渲染繪制±龋混合就是指把兩種顏色混在一起弃舒,具體一點就是把某一像素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起状原,從而實現(xiàn)特殊的效果聋呢。它是一種常用的技巧,通车咔可以用來實現(xiàn)半透明削锰,你也可以通過不同的設(shè)置得到不同的混合結(jié)果,產(chǎn)生一些有趣或者奇怪的圖象毕莱。具體可以參考:
https://www.andersriggelsen.dk/glblendfunc.php器贩,下面是混合的集中模式,可以作用于src,

BlendFactor枚舉類型及其作用朋截。

含義 作用
ONE 全部使用
ZERO 全部不用
SRC_ALPHA 使用源顏色的透明度
SRC_COLOR 使用源顏色
DST_ALPHA 使用目標(biāo)顏色的透明度
DST_COLOR 使用目標(biāo)顏色
ONE_MINUS_SRC_ALPHA 減去源顏色的透明度
ONE_MINUS_SRC_COLOR 減去源顏色
ONE_MINUS_DST_ALPHA 減去目標(biāo)顏色的透明度
ONE_MINUS_DST_COLOR 減去目標(biāo)顏色

關(guān)于粒子在cocos中的使用蛹稍。

cocos create中提供了界面友好的工具供我們使用,粒子的簡單使用可以參考: https://docs.cocos.com/creator/manual/zh/asset-workflow/particle.html
我們可以在cocos中編輯這些粒子效果部服,在編輯的過程中可以預(yù)覽到粒子的實時效果唆姐,粒子相關(guān)的特性基本在plist中聲明即可。

粒子屬性.png

如果我們需要在cocos中通過代碼的形式控制到粒子動畫的播放和停止的話廓八,可以resetSystem()來控制器展現(xiàn)奉芦,利用stopSystem控制其隱藏。示例代碼如下:

//mA 表示要控制的粒子 剧蹂,即  mA: cc.ParticleSystem;
if(this.mA.active) {  
    this.mA.stopSystem();
} else {
    this.mA.resetSystem();
}

關(guān)于顏色計算

關(guān)于cocos源碼的實現(xiàn)

ParticleTest 測試類入口声功。
CCParticleExamples 測試主體類,主要在這里實現(xiàn)宠叼。

CCParticleSystem 是粒子系統(tǒng)的基類先巴,提供對粒子的創(chuàng)建和更新管理。
ParticleSystemQuadCCParticleSystem 的子類,實現(xiàn)不需要批次結(jié)點時也能夠?qū)崿F(xiàn)粒子系統(tǒng)的OPENGL頂點和索引緩沖的創(chuàng)建和渲染.
CCParticleBatchNode 粒子系統(tǒng)的批次節(jié)點筹裕,用于將使用相同紋理的粒子系統(tǒng)進行同批次渲染優(yōu)化處理醋闭。

粒子系統(tǒng)實現(xiàn)類在CCParticleSystem中,其中包含了粒子系統(tǒng)的大部分實現(xiàn)朝卒,下面是粒子系統(tǒng)中的幾個重要方法實現(xiàn)证逻。

將粒子添加到粒子系統(tǒng)的實現(xiàn)(*)

這個是整個粒子系統(tǒng)運行的必要條件,想要粒子系統(tǒng)運行起來抗斤,必須得先將粒子加入到粒子系統(tǒng)中囚企。相關(guān)代碼也比較復(fù)雜,比較多瑞眼。
這里就不貼出具體的代碼龙宏,只給出關(guān)鍵的代碼:

void ParticleSystem::addParticles(int count)
{
    //life
    //position
    //color
    //size
    // rotation
    // position
    // Mode Gravity: 
    針對上面的屬性做賦值處理
}

粒子更新的實現(xiàn)

// ParticleSystem - MainLoop
void ParticleSystem::update(float dt)
{

    // 省略了一些屬性的設(shè)置調(diào)整。

    // 需要被重載的更新粒子的對應(yīng)矩形頂點緩沖信息塊的虛函數(shù),在這里進行界面更新
        updateParticleQuads();
        _transformSystemDirty = false;

    if (_visible && ! _batchNode)
    {
        postStep();
    }
}

粒子的屬性的動態(tài)設(shè)置都會在update中來完成伤疙,然后利用updateParticleQuads來更新指定粒子的頂點緩沖中的位置數(shù)據(jù)银酗,他的具體實現(xiàn)在CCParticleSystemQuad壘中,那么postStep做了什么呢徒像,我們來看他的實現(xiàn)黍特,同樣,他的實現(xiàn)也在CCParticleSystemQuad中锯蛀,

//針對不使用批次結(jié)點時的VBO頂點緩沖的更新灭衷。
void ParticleSystemQuad::postStep()
{
    //綁定頂點緩沖區(qū)對象。 
    glBindBuffer(GL_ARRAY_BUFFER, _buffersVBO[0]);
    
    //用_quads中數(shù)據(jù)更新綁定的緩沖區(qū)數(shù)據(jù)旁涤。
    // Option 1: Sub Data
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(_quads[0])*_totalParticles, _quads);
    
    // Option 2: Data
    //  glBufferData(GL_ARRAY_BUFFER, sizeof(quads_[0]) * particleCount, quads_, GL_DYNAMIC_DRAW);
    
    // Option 3: Orphaning + glMapBuffer
    // glBufferData(GL_ARRAY_BUFFER, sizeof(_quads[0])*_totalParticles, nullptr, GL_STREAM_DRAW);
    // void *buf = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
    // memcpy(buf, _quads, sizeof(_quads[0])*_totalParticles);
    // glUnmapBuffer(GL_ARRAY_BUFFER);
    
    //取消綁定緩沖區(qū)對象翔曲。
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    CHECK_GL_ERROR_DEBUG();
}

停止粒子系統(tǒng)的實現(xiàn)

這個實現(xiàn)就很簡單了,主要把_isActive設(shè)置為false即可劈愚。把開始到當(dāng)前的運行秒數(shù)_elapsed_duration賦值瞳遍, 然后把每秒發(fā)射的粒子數(shù)_elapsed置為0,代碼如下:

void ParticleSystem::stopSystem()
{
    _isActive = false;
    _elapsed = _duration;
    _emitCounter = 0;
}

粒子重新啟動的實現(xiàn)

粒子系統(tǒng)重新啟動的實現(xiàn)也很簡單,主要是把所有的粒子的生命值置為0菌羽。

void ParticleSystem::resetSystem()
{
    _isActive = true;
    _elapsed = 0;
    for (int i = 0; i < _particleCount; ++i)
    {
        _particleData.timeToLive[i] = 0.0f;
    }
}

關(guān)于粒子系統(tǒng)屬性的設(shè)置

cocos 支持兩種方式的屬性設(shè)置掠械,一種是通過字典,一種是通過plist文件算凿。
通過字典的方式份蝴,就是手動去將元素的值賦值給字典犁功,然后通過initWithDictionary方法來實現(xiàn)賦值氓轰,這種方式比較麻煩,而且也比較容易遺漏浸卦,所以我們一般采用第二種方式署鸡,即通過plist文件的形式來賦值。我們可以借助其他工具,生成plist文件靴庆,然后通過ParticleSystem::initWithFile來讀取這個文件时捌,進行賦值。

術(shù)語

混合就是把兩種顏色混在一起炉抒。
具體一點奢讨,就是把某一像素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起焰薄,從而實現(xiàn)特殊的效果拿诸。

假設(shè)我們需要繪制這樣一個場景:透過紅色的玻璃去看綠色的物體,那么可以先繪制綠色的物體塞茅,再繪制紅色玻璃亩码。在繪制紅色玻璃的時候,利用“混合”功能野瘦,把將要繪制上去的紅色和原來的綠色進行混合描沟,于是得到一種新的顏色,看上去就好像玻璃是半透明的鞭光。

前面我們已經(jīng)提到吏廉,混合需要把原來的顏色和將要畫上去的顏色找出來,經(jīng)過某種方式處理后得到一種新的顏色衰猛。這里把將要畫上去的顏色稱為“源顏色”迟蜜,如上例中的紅色;把原來的顏色稱為“目標(biāo)顏色”啡省,如上例中的綠色娜睛。

目的顏色:先畫上的顏色(相當(dāng)于內(nèi)容)。
源顏色: 后畫上去的顏色(相當(dāng)于背景)卦睹。

VAO 用于存儲頂點數(shù)據(jù)畦戒,包括頂點顏色、坐標(biāo)结序、法線障斋,以及頂點的indices。
VBO 用于存儲圖形處理器將怎么使用VBO里面的數(shù)據(jù)徐鹤,及頂點數(shù)據(jù)中哪些是坐標(biāo)垃环、哪些是顏色、哪些是法線等信息返敬。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遂庄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劲赠,更是在濱河造成了極大的恐慌涛目,老刑警劉巖秸谢,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霹肝,居然都是意外死亡估蹄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門沫换,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臭蚁,“玉大人,你說我怎么就攤上這事讯赏】兀” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵待逞,是天一觀的道長甥角。 經(jīng)常有香客問我,道長识樱,這世上最難降的妖魔是什么嗤无? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怜庸,結(jié)果婚禮上当犯,老公的妹妹穿的比我還像新娘。我一直安慰自己割疾,他們只是感情好嚎卫,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宏榕,像睡著了一般拓诸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上麻昼,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天奠支,我揣著相機與錄音,去河邊找鬼抚芦。 笑死倍谜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叉抡。 我是一名探鬼主播尔崔,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褥民!你這毒婦竟也來了季春?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤轴捎,失蹤者是張志新(化名)和其女友劉穎鹤盒,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侦副,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡侦锯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秦驯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尺碰。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖译隘,靈堂內(nèi)的尸體忽然破棺而出亲桥,到底是詐尸還是另有隱情,我是刑警寧澤固耘,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布题篷,位于F島的核電站,受9級特大地震影響厅目,放射性物質(zhì)發(fā)生泄漏番枚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一损敷、第九天 我趴在偏房一處隱蔽的房頂上張望葫笼。 院中可真熱鬧,春花似錦拗馒、人聲如沸路星。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洋丐。三九已至,卻和暖如春挥等,著一層夾襖步出監(jiān)牢的瞬間垫挨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工触菜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留九榔,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓涡相,卻偏偏與公主長得像哲泊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子催蝗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354