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

天行健 君子當自強而不息

D3D中的粒子系統(2)

新建網頁 1

14.2粒子系統的組成

粒子系統是粒子的集合,用來保存和顯示這些粒子。粒子系統維護所有粒子的全部屬性,影響系統中的所有粒子:粒子的尺寸,起始的位置及應用在粒子上的紋理等。粒子系統的方法負責更新、顯示、殺死和創建粒子。

雖然不同的具體(與抽象是相對的)粒子系統有不同的行為,我們歸納并找到一些所有的粒子系統共有的基本屬性,我們把這些公共的屬性放到一個抽象的cParticleSystem基類,它是我們所有的具體粒子系統的父類,現在讓我們看一下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();
    };

一些數據成員:

·        m_origin粒子系統的原點, 這是粒子系統產生時的位置。

·        m_bounding_box創建粒子系統使用的邊界盒,用于限制粒子的活動范圍。例如,假如我們讓雪系統只落在一個圍繞高山的峰頂的體積內,我們會定義一個包括這個體積的邊界盒, 出界的粒子將會被殺死。

·        m_emit_rate新增加到系統中的粒子的速度。通常的標準是每秒。

·        m_size系統中所有粒子的尺寸。

·        m_particles系統中粒子屬性的一個列表。 我們用這個列表創建,釋放及更新粒子。 當我們準備畫粒子時, 我們COPY列表節點的一部分到頂點緩存并畫粒子,同時我們COPY另外一批粒子,然后重復這一過程直到繪制完所有粒子。

·        m_max_particles在給定的時間內,系統中允許的粒子最大數。例如,如果創建粒子的速度比釋放快的話, 隨著時間的增長粒子的數量將會是巨大的,這個成員將避免出現這樣的問題。

·        m_vb_num在給定的時間內頂點緩存中能夠保存的粒子的數量,這個值與實際的粒子系統中的粒子數量無關。

注意:m_vb_offsetm_vb_batch_num數據成員在渲染粒子系統時使用,我們在稍后討論。

方法:

cParticleSystem/ ~cParticleSystem用來初始化默認值和用來釋放設備接口 (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這個方法做與設備無關的初始化工作,比如創建用來保存點精靈的頂點緩存或創建紋理。
    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       注意: 我們使用動態的頂點緩存(D3DUSAGE DYNAMIC)。 因為我們需要在每幀中更新我們的粒子,意思是我們將會去存取頂點緩存的內存,回想一下,訪問一個靜態的頂點緩存慢得不可接受, 所以我們使用動態的頂點緩存。

o       查看我們用過的 D3DUSAGE_POINTS標記,它說明頂點緩存將保存點精靈。

o       頂點緩存的尺寸是由m_vb_num預先確定的,而且與系統中粒子的數量無關。 也就是說, m_vb_num將小于等于系統中粒子的數量。 這是因為渲染粒子系統是一批一批的,不是一次渲染全部。

o       我們使用默認的內存池(pool)代替通常使用的托管內存池,因為動態頂點緩存不能用在托管內存池中。

reset這個方法重新設置系統中每個粒子的屬性:

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

reset_particle這個方法重新設置粒子的屬性。如何重設粒子的屬性,這依賴于具體粒子系統的特性。因此我們定義這個方法為虛擬的,等待子類去實現。

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

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

update這個方法更新系統中所有的粒子。因為這個的方法的執行取決于具體粒子系統的特性,因此我們定義這個方法為抽象的,等待子類去實現。

render這個方法用來顯示系統中所有的粒子。

pre_render用它來初始化渲染狀態,在渲染前設置。 因為系統與系統之間是不同的,所以我們定義它為虛擬的。 默認將執行下列代碼:

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

 post_render用它去保存所有渲染狀態。因為系統與系統間是不同的,所以我們定義它為虛擬的。默認將執行下列代碼:

    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則在當前的系統中沒有粒子, 否則為false.

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

is_dead如果為True則系統中的所有粒子都是死的,否則為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)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩精品不卡| 久久综合伊人77777蜜臀| aa级大片欧美| 亚洲激情女人| 亚洲人成网站色ww在线| 亚洲人在线视频| 99这里有精品| 午夜精品久久久久久久久久久久| 亚洲欧美视频| 欧美日产一区二区三区在线观看| 日韩午夜三级在线| 午夜精品久久久久久久99黑人| 香蕉久久久久久久av网站 | 亚洲高清免费| 久久免费少妇高潮久久精品99| 欧美jjzz| 亚洲永久在线| 蜜桃精品久久久久久久免费影院| 欧美精品一区二区三区很污很色的 | 伊人天天综合| 欧美成人精精品一区二区频| 欧美视频网站| 最新国产成人av网站网址麻豆| 亚洲三级电影在线观看| aaa亚洲精品一二三区| 亚洲欧美成人网| 欧美喷水视频| 国产主播一区二区三区四区| 亚洲另类视频| 久久人人爽人人爽| 亚洲视频日本| 欧美激情久久久久| 国内自拍亚洲| 午夜视频在线观看一区二区三区| 欧美激情国产高清| 欧美在线三级| 国产精品色在线| 亚洲精品国产精品国自产在线 | 欧美丰满少妇xxxbbb| 亚洲亚洲精品三区日韩精品在线视频 | 欧美专区中文字幕| 欧美日韩亚洲综合在线| 久久亚洲私人国产精品va| 日韩视频在线观看| 久热精品视频在线免费观看| 亚洲伊人久久综合| 欧美日韩精品二区第二页| 亚洲高清资源| 老司机一区二区三区| 午夜欧美大片免费观看| 国产精品乱码| 亚洲欧美视频在线观看| 在线亚洲免费视频| 亚洲精品乱码久久久久久按摩观| 久久女同互慰一区二区三区| 国产日韩专区在线| 欧美一区二区在线播放| 亚洲与欧洲av电影| 国产欧美日韩| 久久精品国产亚洲一区二区三区 | 一区二区欧美在线观看| 欧美伦理91| 一区二区免费在线观看| 亚洲欧洲精品天堂一级| 欧美fxxxxxx另类| 亚洲激情图片小说视频| 欧美www在线| 你懂的网址国产 欧美| 亚洲精品视频免费在线观看| 欧美v日韩v国产v| 99精品视频免费观看视频| 欧美专区一区二区三区| 久久久久久久久久久一区| 亚洲精品一区二区三| 久久激情综合| 先锋影音久久久| 欧美激情黄色片| 欧美亚州韩日在线看免费版国语版| 尤物在线精品| 韩国一区电影| 欧美国产在线视频| 亚洲自拍偷拍视频| 欲色影视综合吧| 欧美成人r级一区二区三区| 蜜臀av一级做a爰片久久| 亚洲精品国产精品国自产观看| 午夜精品视频| 午夜精品久久久久| 免费不卡中文字幕视频| 亚洲激情电影中文字幕| 欧美日韩亚洲一区二区三区在线| 99在线|亚洲一区二区| 久久久久九九九九| 最新高清无码专区| 久久综合狠狠综合久久综青草| 欧美日韩日本国产亚洲在线| 亚洲一区二区成人| 亚洲日本在线视频观看| 欧美一级视频| avtt综合网| 亚洲美女性视频| 亚洲国产精品va在线看黑人动漫| 欧美日韩久久不卡| 欧美剧在线观看| 一区二区三区自拍| 亚洲欧洲美洲综合色网| 久久久久99| 久久精品成人一区二区三区蜜臀| 亚洲美女精品久久| 亚洲免费成人av电影| 亚洲国产精品一区二区www在线| 国产日韩欧美综合一区| 亚洲第一在线| 国产主播精品| 亚洲人成人一区二区在线观看 | 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 蜜桃精品一区二区三区| 欧美日韩网址| 亚洲国产欧美日韩另类综合| 久久久免费观看视频| 久久精品视频一| 亚洲第一精品夜夜躁人人躁| 欧美电影美腿模特1979在线看| 欧美/亚洲一区| 一区二区三区四区国产精品| 欧美区高清在线| 欧美日韩国产精品一区| 国产精品视频免费| 亚洲第一黄网| 亚洲欧美视频在线观看| 欧美高清在线一区二区| 国产精品一香蕉国产线看观看| 亚洲国产精品小视频| 欧美一区2区三区4区公司二百| 久久亚洲一区二区三区四区| 日韩视频免费观看高清在线视频| 亚洲天堂成人在线视频| 午夜久久影院| 91久久精品久久国产性色也91| 99在线精品观看| 久久夜色精品国产亚洲aⅴ | 亚洲日本中文字幕免费在线不卡| 亚洲欧美成人网| 欧美在线免费观看亚洲| 欧美视频在线看| 99国产麻豆精品| 亚洲国产经典视频| 久久乐国产精品| 影音先锋久久资源网| 久久成人免费视频| 亚洲欧美色婷婷| 国产在线高清精品| 久久综合国产精品| 欧美α欧美αv大片| 亚洲国产精品一区二区三区| 日韩一区二区福利| 亚洲国产欧美一区二区三区同亚洲| 久久久不卡网国产精品一区| 伊人激情综合| 国产精品你懂的| 亚洲国产高清aⅴ视频| 亚洲盗摄视频| 欧美精品久久99久久在免费线| 99riav1国产精品视频| 亚洲小视频在线| 亚洲国内自拍| 亚洲一区二区在线免费观看视频| 欧美系列一区| 免费观看久久久4p| 欧美日韩无遮挡| 久久中文在线| 国产精品va在线播放| 老司机成人在线视频| 国产精品久久久久av免费| 欧美专区在线| 亚洲国产精品va在线观看黑人 | 欧美国产日韩在线观看| 久久国产毛片| 欧美日韩无遮挡| 亚洲人成网在线播放| 免费精品视频| 欧美日韩在线免费视频| 久久精品国产2020观看福利| 欧美成年人视频网站| 久久女同精品一区二区| 欧美性做爰猛烈叫床潮| 亚洲日本成人| 亚洲国产天堂久久综合网| 欧美亚洲综合网| 亚洲欧美日韩爽爽影院| 国产精品久久久久久久久久久久久| 亚洲成色www久久网站| 在线成人av| 麻豆91精品91久久久的内涵| 久久综合狠狠综合久久激情| 亚洲高清视频中文字幕| 欧美中文在线免费| 激情综合色丁香一区二区| 久久躁狠狠躁夜夜爽| 亚洲激情另类|