青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當(dāng)自強(qiáng)而不息

D3D中的粒子系統(tǒng)(2)

新建網(wǎng)頁 1

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

粒子系統(tǒng)是粒子的集合,用來保存和顯示這些粒子。粒子系統(tǒng)維護(hù)所有粒子的全部屬性,影響系統(tǒng)中的所有粒子:粒子的尺寸,起始的位置及應(yīng)用在粒子上的紋理等。粒子系統(tǒng)的方法負(fù)責(zé)更新、顯示、殺死和創(chuàng)建粒子。

雖然不同的具體(與抽象是相對的)粒子系統(tǒng)有不同的行為,我們歸納并找到一些所有的粒子系統(tǒng)共有的基本屬性,我們把這些公共的屬性放到一個(gè)抽象的cParticleSystem基類,它是我們所有的具體粒子系統(tǒng)的父類,現(xiàn)在讓我們看一下cParticleSystem類:

    class cParticleSystem
    {
   
protected:
        IDirect3DDevice9*            m_device;
        D3DXVECTOR3                    m_origin;
        cBoundingBox                m_bounding_box;
        
float                        m_emit_rate;        // rate new particles are added to system
   
    float                        m_size;                // size of particles
   
        IDirect3DTexture9*            m_texture;
        IDirect3DVertexBuffer9*     m_vertex_buffer;
        list<sParticleAttribute>    m_particles;
        
int                            m_max_particles;    // max allowed particles system can have
   
        // following three data elements used for rendering the particle system efficiently
   

        DWORD    m_vb_num;        
// particle number in vertex buffer
   
    DWORD    m_vb_offset;    // offset in vertex buffer to lock
   
    DWORD    m_vb_batch_num;    // number of vertices to lock starting at m_vb_offset
   

   
public:
        cParticleSystem();
        
virtual ~cParticleSystem();
   
        
virtual bool init(IDirect3DDevice9*    device, const char* texture_filename);
        
virtual void reset();
   
        
// sometimes we don't want to free the memory of a dead particle, but rather respawn it instead.
   
    virtual void reset_particle(sParticleAttribute* particl_attr) = 0;
        
virtual void add_particle();
   
        
virtual void update(float time_delta) = 0;
   
        
virtual void pre_render();
        
virtual void render();
        
virtual void post_render();
   
        
bool is_empty();
        
bool is_dead();
   
   
protected:
        
virtual void remove_dead_particles();
    };

一些數(shù)據(jù)成員:

·        m_origin粒子系統(tǒng)的原點(diǎn), 這是粒子系統(tǒng)產(chǎn)生時(shí)的位置。

·        m_bounding_box創(chuàng)建粒子系統(tǒng)使用的邊界盒,用于限制粒子的活動(dòng)范圍。例如,假如我們讓雪系統(tǒng)只落在一個(gè)圍繞高山的峰頂?shù)捏w積內(nèi),我們會(huì)定義一個(gè)包括這個(gè)體積的邊界盒, 出界的粒子將會(huì)被殺死。

·        m_emit_rate新增加到系統(tǒng)中的粒子的速度。通常的標(biāo)準(zhǔn)是每秒。

·        m_size系統(tǒng)中所有粒子的尺寸。

·        m_particles系統(tǒng)中粒子屬性的一個(gè)列表。 我們用這個(gè)列表創(chuàng)建,釋放及更新粒子。 當(dāng)我們準(zhǔn)備畫粒子時(shí), 我們COPY列表節(jié)點(diǎn)的一部分到頂點(diǎn)緩存并畫粒子,同時(shí)我們COPY另外一批粒子,然后重復(fù)這一過程直到繪制完所有粒子。

·        m_max_particles在給定的時(shí)間內(nèi),系統(tǒng)中允許的粒子最大數(shù)。例如,如果創(chuàng)建粒子的速度比釋放快的話, 隨著時(shí)間的增長粒子的數(shù)量將會(huì)是巨大的,這個(gè)成員將避免出現(xiàn)這樣的問題。

·        m_vb_num在給定的時(shí)間內(nèi)頂點(diǎn)緩存中能夠保存的粒子的數(shù)量,這個(gè)值與實(shí)際的粒子系統(tǒng)中的粒子數(shù)量無關(guān)。

注意:m_vb_offsetm_vb_batch_num數(shù)據(jù)成員在渲染粒子系統(tǒng)時(shí)使用,我們在稍后討論。

方法:

cParticleSystem/ ~cParticleSystem用來初始化默認(rèn)值和用來釋放設(shè)備接口 (vertex buffer, texture)

    cParticleSystem::cParticleSystem()
    {
        m_device        = NULL;
        m_vertex_buffer = NULL;
        m_texture        = NULL;
    }
   
    cParticleSystem::~cParticleSystem()
    {
        safe_release<IDirect3DVertexBuffer9*>(m_vertex_buffer);
        safe_release<IDirect3DTexture9*>(m_texture);
    }

init這個(gè)方法做與設(shè)備無關(guān)的初始化工作,比如創(chuàng)建用來保存點(diǎn)精靈的頂點(diǎn)緩存或創(chuàng)建紋理。
    bool cParticleSystem::init(IDirect3DDevice9* device, const char* texture_filename)
    {
        
// Vertex buffer's number does not equal the number of particles in our system.  
        // We use the vertex buffer to draw a portion of our particles at a time.  
        // The arbitrary number we choose for the vertex buffer is specified by the m_vb_num variable.
   

        m_device = device;
   
        HRESULT hr;
   
        hr = device->CreateVertexBuffer(
                m_vb_num * 
sizeof(sParticle),
                D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS | D3DUSAGE_WRITEONLY,
                PARTICLE_FVF,
                D3DPOOL_DEFAULT,    
// D3DPOOL_MANAGED can't be used with D3DUSAGE_DYNAMIC
   
            &m_vertex_buffer,
                NULL);
   
        
if(FAILED(hr))
        {
            MessageBox(NULL, "CreateVertexBuffer() - FAILED", "ParticleSystem", MB_OK);
            
return false;
        }
   
        hr = D3DXCreateTextureFromFile(device, texture_filename, &m_texture);
   
        
if(FAILED(hr))
        {
            MessageBox(NULL, "D3DXCreateTextureFromFile() - FAILED", "ParticleSystem", MB_OK);
            
return false;
        }
   
        
return true;
    }

o       注意: 我們使用動(dòng)態(tài)的頂點(diǎn)緩存(D3DUSAGE DYNAMIC)。 因?yàn)槲覀冃枰诿繋懈挛覀兊牧W?span lang="EN-US">,意思是我們將會(huì)去存取頂點(diǎn)緩存的內(nèi)存,回想一下,訪問一個(gè)靜態(tài)的頂點(diǎn)緩存慢得不可接受, 所以我們使用動(dòng)態(tài)的頂點(diǎn)緩存。

o       查看我們用過的 D3DUSAGE_POINTS標(biāo)記,它說明頂點(diǎn)緩存將保存點(diǎn)精靈。

o       頂點(diǎn)緩存的尺寸是由m_vb_num預(yù)先確定的,而且與系統(tǒng)中粒子的數(shù)量無關(guān)。 也就是說, m_vb_num將小于等于系統(tǒng)中粒子的數(shù)量。 這是因?yàn)殇秩玖W酉到y(tǒng)是一批一批的,不是一次渲染全部。

o       我們使用默認(rèn)的內(nèi)存池(pool)代替通常使用的托管內(nèi)存池,因?yàn)閯?dòng)態(tài)頂點(diǎn)緩存不能用在托管內(nèi)存池中。

reset這個(gè)方法重新設(shè)置系統(tǒng)中每個(gè)粒子的屬性:

    void cParticleSystem::reset()
    {
        
for(list<sParticleAttribute>::iterator iter = m_particles.begin(); iter != m_particles.end(); iter++)
            reset_particle(&(*iter));
    }

reset_particle這個(gè)方法重新設(shè)置粒子的屬性。如何重設(shè)粒子的屬性,這依賴于具體粒子系統(tǒng)的特性。因此我們定義這個(gè)方法為虛擬的,等待子類去實(shí)現(xiàn)。

 add_particle這個(gè)方法用來在系統(tǒng)中增加一個(gè)粒子。在增加它到粒子列表之前,使用reset_particle方法先初始化粒子:

    void cParticleSystem::add_particle()
    {
        sParticleAttribute attr;
        reset_particle(&attr);
   
        m_particles.push_back(attr);
    }

update這個(gè)方法更新系統(tǒng)中所有的粒子。因?yàn)檫@個(gè)的方法的執(zhí)行取決于具體粒子系統(tǒng)的特性,因此我們定義這個(gè)方法為抽象的,等待子類去實(shí)現(xiàn)。

render這個(gè)方法用來顯示系統(tǒng)中所有的粒子。

pre_render用它來初始化渲染狀態(tài),在渲染前設(shè)置。 因?yàn)橄到y(tǒng)與系統(tǒng)之間是不同的,所以我們定義它為虛擬的。 默認(rèn)將執(zhí)行下列代碼:

    void cParticleSystem::pre_render()
    {
        m_device->SetRenderState(D3DRS_LIGHTING,          FALSE);
        m_device->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE);
        m_device->SetRenderState(D3DRS_POINTSCALEENABLE,  TRUE);
        m_device->SetRenderState(D3DRS_POINTSIZE,          float_to_dword(m_size));
        m_device->SetRenderState(D3DRS_POINTSIZE_MIN,      float_to_dword(0.0f));
   
        
// control the size of the particle relative to distance
   
        m_device->SetRenderState(D3DRS_POINTSCALE_A,    float_to_dword(0.0f));
        m_device->SetRenderState(D3DRS_POINTSCALE_B,    float_to_dword(0.0f));
        m_device->SetRenderState(D3DRS_POINTSCALE_C,    float_to_dword(1.0f));
   
        
// use alpha from texture
   
        m_device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
        m_device->SetTextureStageState(0, D3DTSS_ALPHAOP,    D3DTOP_SELECTARG1);
   
        m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
        m_device->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
        m_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    }

  注意:我們使用alpha混合渲染,以便設(shè)置紋理的alpha通道,來設(shè)置紋理像素的透明,用它產(chǎn)生多種效果。一種特殊的情況是:獲得象紋理那樣的非矩形的粒子。例如,獲得一個(gè)圓形“雪球形”的粒子,我們使用一個(gè)簡單的帶有alpha通道的紋理,它看上去是背景為黑色的帶有白色圓形的樣子。因此,顯示出來時(shí)只是一個(gè)白圓,這比白色的矩形紋理要好。

 post_render用它去保存所有渲染狀態(tài)。因?yàn)橄到y(tǒng)與系統(tǒng)間是不同的,所以我們定義它為虛擬的。默認(rèn)將執(zhí)行下列代碼:

    void cParticleSystem::post_render()
    {
        m_device->SetRenderState(D3DRS_LIGHTING, TRUE);
        m_device->SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE);
        m_device->SetRenderState(D3DRS_POINTSCALEENABLE,  FALSE);
        m_device->SetRenderState(D3DRS_ALPHABLENDENABLE,  FALSE);
    }

 is_empty如果為True則在當(dāng)前的系統(tǒng)中沒有粒子, 否則為false.

    bool cParticleSystem::is_empty()
    {
        
return m_particles.empty();
    }

is_dead如果為True則系統(tǒng)中的所有粒子都是死的,否則為false
    bool cParticleSystem::is_dead()
    {
        
for(list<sParticleAttribute>::iterator iter = m_particles.begin(); iter != m_particles.end(); iter++)
        {
            
// Is there at least one living particle? If yes, the system is not dead.
   
        if(iter->is_alive)
                
return false;
        }
   
        
// No living particles found, the system must be dead.
   
    return true;
    }

remove_dead_particles搜索屬_particle性表,從表中殺死并刪除粒子。

    void cParticleSystem::remove_dead_particles()
    {
        list<sParticleAttribute>::iterator iter = m_particles.begin();
   
        
while(iter != m_particles.end())
        {        
            
if(! iter->is_alive)
                
// erase returns the next iterator, so no need to increment to the next one ourseleves.
   
                iter = m_particles.erase(iter);
            
else
                iter++;    
// next in list
   
    }
    }

posted on 2008-04-03 17:24 lovedday 閱讀(1058) 評論(0)  編輯 收藏 引用

公告

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品爱久久久久久久| 久久综合国产精品| 欧美性大战久久久久| 欧美成人三级在线| 欧美在线综合视频| 亚洲欧美自拍偷拍| 亚洲女女女同性video| 欧美一区二区在线免费播放| 国产精品中文在线| 国产精品普通话对白| 亚洲高清在线观看| 亚洲欧美激情一区| 亚洲欧美日韩一区二区| 午夜视频一区二区| 久久er精品视频| 噜噜爱69成人精品| 久久综合影音| 欧美不卡视频一区发布| 亚洲人成毛片在线播放| 亚洲视频网在线直播| 欧美一二区视频| 久久女同互慰一区二区三区| 麻豆精品精华液| 欧美激情视频在线播放| 国产精品成人观看视频免费| 国产麻豆9l精品三级站| 狠狠色狠狠色综合日日tαg | 中文精品一区二区三区| 欧美激情国产高清| 亚洲第一页在线| 免费成人美女女| 欧美日韩国内自拍| 老司机精品视频一区二区三区| 性色一区二区三区| 欧美国产视频日韩| 亚洲男人影院| 日韩亚洲欧美一区| 亚洲精品美女免费| 欧美日韩一区三区| 精品电影一区| 欧美视频手机在线| 欧美日韩视频免费播放| 欧美黄色小视频| 国产欧美日韩精品专区| 最新国产成人在线观看| 欧美日韩一区二| 欧美日韩国产一级| 欧美日韩一区二区三区高清| 欧美激情一区二区三区在线| 欧美三级不卡| 久久www成人_看片免费不卡| 午夜欧美精品| 久久久精品tv| 欧美屁股在线| 欧美一区午夜精品| 一本久久综合亚洲鲁鲁五月天| 亚洲人成人77777线观看| 亚洲精品美女在线| 日韩手机在线导航| 欧美成人精品高清在线播放| 欧美一级片久久久久久久| 亚洲精品乱码久久久久久蜜桃91| 久久久99精品免费观看不卡| 欧美1区免费| 国产精品呻吟| 亚洲黄色av一区| 亚洲欧美欧美一区二区三区| 麻豆精品91| 午夜视频一区二区| 欧美福利专区| 亚洲国产视频一区| 欧美一级日韩一级| 亚洲天堂男人| 久久亚洲精品网站| 欧美资源在线| 欧美色123| 国产精品入口66mio| 在线观看日韩av先锋影音电影院 | 国产日韩在线一区| 欧美+日本+国产+在线a∨观看| 欧美精品国产精品| 国产一区二区三区av电影 | 欧美诱惑福利视频| 免费观看在线综合| 国产午夜精品视频| 在线视频亚洲| 亚洲国产视频a| 久久国产精品久久国产精品| 欧美伊久线香蕉线新在线| 亚洲精品乱码久久久久久蜜桃91| 日韩写真在线| 欧美国内亚洲| 欧美一区二区在线观看| 国产精品乱子乱xxxx| 日韩一区二区免费高清| 欧美jizz19性欧美| 亚洲日本无吗高清不卡| 国产精品高精视频免费| 宅男精品视频| 亚洲第一精品影视| 久久精品国产久精国产爱| 欧美 日韩 国产一区二区在线视频 | 美女视频黄a大片欧美| 亚洲美女少妇无套啪啪呻吟| 日韩写真在线| 亚洲精品视频一区| 欧美激情精品久久久久久变态| 久久福利毛片| 韩国福利一区| 欧美凹凸一区二区三区视频| 欧美~级网站不卡| 美女精品网站| 亚洲国产精品国自产拍av秋霞| 在线视频欧美日韩精品| 欧美aaaaaaaa牛牛影院| 欧美福利视频| 亚洲高清三级视频| 亚洲成人在线免费| 亚洲人成亚洲人成在线观看图片| 久久先锋资源| 欧美国产精品v| 亚洲一区免费观看| 国产欧美日韩一区二区三区| 久久免费少妇高潮久久精品99| 久久亚洲一区二区三区四区| 欧美成人免费小视频| 久久露脸国产精品| 91久久精品www人人做人人爽| 欧美高清视频在线| 免费国产自线拍一欧美视频| 一本久道久久综合婷婷鲸鱼| 欧美三级欧美一级| 亚洲一区免费观看| 午夜精品久久久| 在线视频你懂得一区| 免费日韩精品中文字幕视频在线| 欧美黄网免费在线观看| 久久国产免费| 国内综合精品午夜久久资源| 国产精品xnxxcom| 久久精品一区二区| 日韩亚洲欧美成人| 亚洲欧美日韩综合国产aⅴ| 欧美精品v国产精品v日韩精品| 日韩一区二区高清| 亚洲私人影院在线观看| 亚洲黄色大片| 亚洲午夜精品网| 久久成人精品电影| 国产精品一区视频| 亚洲国产成人久久综合| 久久国产精品久久久久久久久久| 亚洲精品日韩激情在线电影| 久久久亚洲国产天美传媒修理工| 久久久久国产精品麻豆ai换脸| 欧美一区二区三区免费看| 裸体丰满少妇做受久久99精品| 亚洲午夜视频在线| 麻豆亚洲精品| 亚洲视频狠狠| 久久久91精品国产一区二区精品| 在线视频国产日韩| 欧美激情精品久久久久久蜜臀| 欧美一级黄色网| 亚洲综合精品| 亚洲国产精品久久精品怡红院| 欧美金8天国| 久久全国免费视频| 欧美中文字幕精品| 久久精品亚洲一区二区三区浴池| 久久久激情视频| 亚洲欧美另类国产| 久久综合九色| 欧美激情一区二区三区不卡| 欧美激情一二三区| 久久久噜噜噜久久中文字幕色伊伊| 欧美在线精品一区| 国产精品久久久久永久免费观看| 亚洲国产日韩欧美一区二区三区| 久久精品亚洲热| 国精品一区二区三区| 亚洲精品久久久久久久久久久久久| 欧美aⅴ一区二区三区视频| 亚洲激情二区| 国产精品igao视频网网址不卡日韩| 影音先锋日韩精品| 欧美尤物巨大精品爽| 亚洲欧美视频在线观看| 1000部国产精品成人观看| 久久久久久色| 亚洲无线视频| 一区二区三区视频在线观看| 精品成人免费| 一二三四社区欧美黄| 亚洲女女女同性video| 欧美一级视频| 亚洲久久在线| 欧美日韩在线精品| 欧美二区视频| 欧美aaaaaaaa牛牛影院|