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

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

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

許多自然現(xiàn)象是由很多小的小顆粒組成的,它們有相似的行為。(例如,雪花落下,閃爍的火焰,沖出槍管的“子彈”),粒子系統(tǒng)用來模擬這種現(xiàn)象。


14.1 粒子和點精靈(Point Sprite)

粒子是一個很小的對象,它通常用來模擬數(shù)學(xué)中的一個點。點元是用來顯示粒子的很好的方案,可是點元被光柵化成一個簡單的像素。這沒給我們多少靈活性,因為我們想有各種大小不同的粒子,并且把整個紋理平滑映射到這些粒子上。在Direct3D 8.0以前,因為點元方法的局限性而完全不使用他們。代替的方法是程序員將使用公告板去顯示粒子,一個板是一個方格,世界矩陣用它來確定方向,使它總是朝向照相機。

Direct3D 8.0引入一個特殊的點元叫點精靈,多數(shù)時候被應(yīng)用在粒子系統(tǒng)中。與一般的點元不同的是,點精靈有紋理映射并能改變大小。與公告板不同的是,能用一個簡單的點描述一個點精靈,節(jié)省內(nèi)存和處理時間,因為我們只是必須保存和處理一個點,而公告板則是四個。

14.1.1 結(jié)構(gòu)的格式

我們使用下面的頂點結(jié)構(gòu)來描述粒子的位置和顏色:

struct sParticle
{
    D3DXVECTOR3 position;
    D3DCOLOR    color;
};

const DWORD PARTICLE_FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

 

這個結(jié)構(gòu)只保存粒子的位置和顏色,這取決于你程序的需要,你能夠用同樣的結(jié)構(gòu)去保存一套紋理坐標(biāo)。

增加一個浮點變量給Particle結(jié)構(gòu)去指定粒子的大小是可能的。我們必須增加一個D3DFVF_PSIZE標(biāo)記給我們的靈活的頂點格式,以反映這個變化。每個粒子維護自己的大小很有用,因為它允許我們以具體情況指定并改變粒子的大小。可是,大多數(shù)的圖形卡不支持控制粒子的大小,因此我們不使用它。(檢查D3DFVFCAPS_PSIZE在D3 DCAPS9結(jié)構(gòu)的FVFCaps成員)代替的方法是用渲染狀態(tài)(render states)去控制粒子的大小,就像你很快看到的,有尺寸成員的頂點結(jié)構(gòu)的例子:

strict Particle

{

     D3DXVECTOR3 _position;

     D3DCOLOR    _color;

     float       _size;

     static const DWORD FVF;

};

const DWORD Particle::FVF = D3DFVF XYZ | D3DFVF DIFFUSE |  D3DFVF_PSIZE;

注意:通過vertex shader,能夠獲取每個粒子的大小,即使你的硬件不支持D3DFVFCAPS_PSIZE。

14.1.2點精靈(Point Sprite)渲染狀態(tài)

點精靈的行為大部分由渲染狀態(tài)(render states)來控制,現(xiàn)在讓我們來看一下這些渲染狀態(tài):

D3DRS_POINTSPRITEENABLE—A Boolean value. The default value is false.

True表示將當(dāng)前的紋理全部映射到點精靈上。

False 表示用指定的紋理坐標(biāo)映射到點精靈的點(圖素)上。

_device->SetRenderState(D3DRS_POINTSPRITEENABLE, true);

D3DRS_POINTSPRITEENABLE
bool value. When TRUE, texture coordinates of point primitives are set so that full textures are mapped on each point. When FALSE, the vertex texture coordinates are used for the entire point. The default value is FALSE. You can achieve DirectX 7 style single-pixel points by setting D3DRS_POINTSCALEENABLE to FALSE and D3DRS_POINTSIZE to 1.0, which are the default values.

D3DRS_POINTSCALEENABLE—A Boolean value. The default value is false.

True表示用視圖空間單位來解釋點的大小。視圖空間單位的3D空間點在照相機中,點精靈將會自動縮放,這取決到它有多遠(yuǎn), 像其他對象一樣,離照相機近的粒子比離照相機遠(yuǎn)的粒子要大。

False 表示點的大小將用屏幕空間單位來解釋。屏幕空間單位是屏幕上的像素單位。. 因此如果你指定false, 例如, 設(shè)置點精靈的尺寸為3, 則點精靈在屏幕區(qū)域中的尺寸為3×3像素。.

_device->SetRenderState(D3DRS_POINTSCALEENABLE, true);

D3DRS_POINTSCALEENABLE
bool value that controls computation of size for point primitives. When TRUE, the point size is interpreted as a camera space value and is scaled by the distance function and the frustum to viewport y-axis scaling to compute the final screen-space.

D3DRS_POINTSIZE—表示點精靈的尺寸. 這個值可以任意指定視圖空間或屏幕空間的點精靈的尺寸, 取決于D3DRS_POINTSCALEENABLE狀態(tài)如何設(shè)置. 下面的代碼段設(shè)置點的尺寸為2.5個單位。:

_device->SetRenderState( D3DRS_POINTSIZE, float_to_dword(2.5f) );

D3DRS_POINTSIZE
A float value that specifies the size to use for point size computation in cases where point size is not specified for each vertex. This value is not used when the vertex contains point size. This value is in screen space units if D3DRS_POINTSCALEENABLE is FALSE; otherwise this value is in world space units. The default value is the value a driver returns. If a driver returns 0 or 1, the default value is 64, which allows software point size emulation. Because the IDirect3DDevice9::SetRenderState method accepts DWORD values, your application must cast a variable that contains the value, as shown in the following code example.
m_pDevice9->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&pointSize));
DWORD float_to_dword(float f)
{
    return *((DWORD*)&f);
}
 

D3DRS_POINTSIZE_MIN—表示點精靈的最小尺寸。例子,將設(shè)置最小值為0.2:

_device->SetRenderState(D3DRS_POINTSIZE_MIN, float_to_dword(0.2f));

D3DRS_POINTSIZE_MIN
A float value that specifies the minimum size of point primitives. Point primitives are clamped to this size during rendering. Setting this to values smaller than 1.0 results in points dropping out when the point does not cover a pixel center and antialiasing is disabled or being rendered with reduced intensity when antialiasing is enabled. The default value is 1.0f. The range for this value is greater than or equal to 0.0f. Because the IDirect3DDevice9::SetRenderState method accepts DWORD values, your application must cast a variable that contains the value, as shown in the following code example.
m_pDevice9->SetRenderState(D3DRS_POINTSIZE_MIN, *((DWORD*)&pointSizeMin));

D3DRS_POINTSIZE_MAX—表示點精靈的最大尺寸。例子,將設(shè)置最大值為5.0:

_device->SetRenderState(D3DRS_POINTSIZE_MAX, float_to_dword(5.0f));

D3DRS_POINTSIZE_MAX
A float value that specifies the maximum size to which point sprites will be clamped. The value must be less than or equal to the MaxPointSize member of D3DCAPS9 and greater than or equal to D3DRS_POINTSIZE_MIN. The default value is 64.0. Because the IDirect3DDevice9::SetRenderState method accepts DWORD values, your application must cast a variable that contains the value, as shown in the following code example.
m_pDevice9->SetRenderState(D3DRS_PONTSIZE_MAX, *((DWORD*)&pointSizeMax));

D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, D3DRS_POINTSCALE_C—這3個常量表示如何根據(jù)距離控制點精靈的尺寸—這個距離是點精靈到照相機的距離。

D3DRS_POINTSCALE_A
A float value that controls for distance-based size attenuation for point primitives. Active only when D3DRS_POINTSCALEENABLE is TRUE. The default value is 1.0f. The range for this value is greater than or equal to 0.0f. Because the IDirect3DDevice9::SetRenderState method accepts DWORD values, your application must cast a variable that contains the value, as shown in the following code example.
m_pDevice9->SetRenderState(D3DRS_POINTSCALE_A, *((DWORD*)&pointScaleA));
D3DRS_POINTSCALE_B
A float value that controls for distance-based size attenuation for point primitives. Active only when D3DRS_POINTSCALEENABLE is TRUE. The default value is 0.0f. The range for this value is greater than or equal to 0.0f. Because the IDirect3DDevice9::SetRenderState method accepts DWORD values, your application must cast a variable that contains the value, as shown in the following code example.
m_pDevice9->SetRenderState(D3DRS_POINTSCALE_B, *((DWORD*)&pointScaleB));
D3DRS_POINTSCALE_C
A float value that controls for distance-based size attenuation for point primitives. Active only when D3DRS_POINTSCALEENABLE is TRUE. The default value is 0.0f. The range for this value is greater than or equal to 0.0f. Because the IDirect3DDevice9::SetRenderState method accepts DWORD values, your application must cast a variable that contains the value, as shown in the following code example.
m_pDevice9->SetRenderState(D3DRS_POINTSCALE_C, *((DWORD*)&pointScaleC));

D3D用以下的公式去計算點精靈的最終尺寸,這取決于距離和這3個常量。

其中:

FinalSize:距離計算后,點精靈的最后尺寸。

ViewportHeight:視口的高度。

Size:分別為D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B, and D3DRS_POINTSCALE_C值。

D:在視圖空間中點精靈與照相機的距離。因為照相機被放置在視圖空間中的原點,這個值是:,也是點精靈所在的位置。

下面代碼設(shè)置點精靈的距離常量,因此遠(yuǎn)處的點精靈將變小。

_device->SetRenderState(D3DRS_POINTSCALE_A, float_to_dword(0.0f));

_device->SetRenderState(D3DRS_POINTSCALE_B, float_to_dword(0.0f));

_device->SetRenderState(D3DRS_POINTSCALE_C, float_to_dword(1.0f));

 

14.1.3 粒子和他們的屬性

 一個粒子系統(tǒng)是由除了位置、顏色以外的更多的屬性組成,例如,一個粒子有速度。然而,這些額外的屬性對于渲染粒子來說不是必須的。因此,我們在單獨的結(jié)構(gòu)中保存渲染粒子所必須的數(shù)據(jù)和屬性。當(dāng)我們創(chuàng)建、顯示或更新粒子時,我們使用屬性來工作。當(dāng)我們準(zhǔn)備渲染時,我們從sParticle(粒子)結(jié)構(gòu)中COPY位置和顏色。

對于我們模擬的具體粒子系統(tǒng),粒子的屬性也是不同的。因此我們能夠歸納一些通用的屬性,大多數(shù)系統(tǒng)用不上這么多,一些系統(tǒng)需要的屬性這里可能還沒有。

struct sParticleAttribute
{
    sParticleAttribute()
    {
        life_time = 0.0f;
        age          = 0.0f;
        is_alive  = true;
    }

    D3DXVECTOR3 position;
    D3DXVECTOR3 velocity;
    D3DXVECTOR3 acceleration;
    float        life_time;        // how long the particle lives for before dying
    float        age;            // current age of the particle
    D3DXCOLOR    color;            // current color of the particle
    D3DXCOLOR    color_fade;        // how the color fades with respect to time
    bool        is_alive;
};

position—粒子在世界空間中的位置

velocity—粒子的速度,每秒多少個單位。

acceleration—粒子的加速度, 每秒多少個單位。

life_time—粒子的生命周期. 例如,當(dāng)一個時間段后,我們可以殺死一個激光柱的粒子.

age—粒子的當(dāng)前年齡。

color—粒子的顏色。

color_fade—粒子隨時間的變化而褪去的顏色。

is_alive—True 表示粒子活著;false 表示粒子死了。


posted on 2008-04-03 16:55 lovedday 閱讀(3197) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(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>
            免费日韩成人| 久久久久国产成人精品亚洲午夜| 嫩模写真一区二区三区三州| 亚洲国产精品一区在线观看不卡| 美女任你摸久久| 免费日韩av| 亚洲一区二区三区四区五区黄 | 亚洲国产日韩在线| 欧美国产日韩一区二区三区| 欧美精品在线观看播放| 亚洲一区亚洲| 久久精品国产免费| 亚洲精品国产精品乱码不99| 99伊人成综合| 国内成人精品一区| 亚洲精品在线观| 国产精品一区在线观看| 欧美成人在线影院| 欧美午夜片在线免费观看| 久久久另类综合| 欧美激情精品久久久久| 欧美一级欧美一级在线播放| 久色成人在线| 午夜视频在线观看一区二区三区| 久久精品国产一区二区三区免费看 | 一区电影在线观看| 国产在线视频欧美| aⅴ色国产欧美| 影音先锋日韩资源| 在线视频免费在线观看一区二区| 国产专区欧美精品| av成人黄色| 亚洲国产你懂的| 亚洲在线一区二区三区| 91久久久在线| 欧美在线视频免费| 亚洲影院色无极综合| 欧美不卡一区| 久久一区二区三区国产精品| 国产精品chinese| 欧美高清在线视频观看不卡| 国产日本欧美一区二区三区| 亚洲日本中文字幕免费在线不卡| 国产三级精品在线不卡| 一区二区三区视频在线观看| 最新中文字幕一区二区三区| 久久爱www| 久久gogo国模啪啪人体图| 欧美日韩免费高清一区色橹橹| 欧美二区不卡| 一区视频在线| 久久精品视频在线| 久久精品国产精品亚洲精品| 国产精品视频专区| 一区二区三区免费在线观看| 艳女tv在线观看国产一区| 老司机午夜精品视频| 裸体一区二区| 在线观看视频免费一区二区三区| 西西裸体人体做爰大胆久久久| 亚洲欧美日韩精品久久奇米色影视| 欧美久久久久久久| 日韩视频免费看| 正在播放日韩| 欧美体内谢she精2性欧美| 亚洲精品资源美女情侣酒店| 一区二区三区欧美在线观看| 欧美日韩国产大片| 日韩午夜精品| 亚洲神马久久| 国产精品日韩一区| 欧美亚洲尤物久久| 久热精品视频| 亚洲国产一区二区三区a毛片| 免费不卡视频| 日韩亚洲欧美成人一区| 亚洲一区二区不卡免费| 国产精品一区二区三区免费观看 | 亚洲高清自拍| 一区二区三区四区五区精品视频| 欧美体内she精视频在线观看| 亚洲婷婷综合色高清在线| 欧美在线视频播放| 伊人婷婷欧美激情| 欧美伦理视频网站| 亚洲一区二区黄色| 久久久蜜臀国产一区二区| 亚洲电影免费| 国产精品99免视看9| 羞羞答答国产精品www一本| 欧美成年人视频网站| 亚洲最新色图| 国产一区二区三区在线观看精品 | 136国产福利精品导航| 欧美精品乱人伦久久久久久| 宅男噜噜噜66一区二区66| 久久精品一区二区三区中文字幕| 亚洲国产精品第一区二区| 欧美日韩一区在线观看| 欧美一区二区三区四区夜夜大片 | 免费日韩精品中文字幕视频在线| 亚洲精选在线| 国产一区二区电影在线观看| 欧美高清在线精品一区| 亚洲欧美变态国产另类| 欧美激情一级片一区二区| 亚洲欧美一区二区三区极速播放 | 亚洲免费观看高清完整版在线观看熊 | 精品av久久久久电影| 欧美另类亚洲| 久久蜜桃资源一区二区老牛 | 91久久久久久久久| 久久国产精品72免费观看| 日韩视频在线观看国产| 国产亚洲在线| 欧美性大战久久久久久久| 欧美**人妖| 久久精品72免费观看| 一区二区三区 在线观看视频| 免费亚洲电影| 久久久久久久久久久一区| 亚洲无玛一区| 日韩午夜在线观看视频| 在线观看免费视频综合| 国产日韩欧美一区在线 | 久久综合色8888| 欧美一区二区三区四区高清 | 亚洲美女免费视频| 亚洲电影免费观看高清完整版在线 | 国产亚洲日本欧美韩国| 国产精品久久久久9999高清| 欧美激情精品久久久久久大尺度| 久久爱另类一区二区小说| 亚洲一区二区三区中文字幕在线| 最新成人在线| 亚洲国产婷婷| 亚洲黄色天堂| 亚洲欧洲视频在线| 亚洲欧洲精品一区二区三区不卡 | 久久激情五月婷婷| 欧美专区日韩视频| 久久国产精品免费一区| 性色av一区二区怡红| 香蕉乱码成人久久天堂爱免费| 亚洲一级在线| 亚洲欧美日韩中文播放| 午夜激情综合网| 欧美在线黄色| 久久伊人亚洲| 欧美国产日本高清在线| 欧美激情成人在线| 亚洲欧洲免费视频| 夜夜爽av福利精品导航| 亚洲视频电影图片偷拍一区| 亚洲一区二区av电影| 亚洲自拍电影| 久久精品视频播放| 欧美高清视频| 欧美手机在线视频| 国产欧美一区二区精品性| 国产在线拍揄自揄视频不卡99| 在线观看亚洲视频| 日韩性生活视频| 亚洲综合社区| 久久蜜桃资源一区二区老牛 | 欧美在线视频一区二区| 久久免费国产| 亚洲国产福利在线| 国产精品99久久久久久久女警| 午夜一级在线看亚洲| 久久视频在线看| 欧美日韩亚洲网| 国产日韩亚洲欧美精品| 亚洲国产精品免费| 亚洲免费视频网站| 久久亚洲精品一区| 99国产精品久久| 欧美在线精品一区| 欧美日韩精选| 狠狠色综合网| 亚洲一区二区三区精品视频| 另类人畜视频在线| av不卡在线| 久热这里只精品99re8久| 国产精品国产三级国产普通话蜜臀 | 国产精品久久久久久久久久尿 | 久久精品欧洲| 亚洲毛片在线观看| 久久精品女人的天堂av| 欧美午夜片在线观看| 亚洲黄色毛片| 久久精品日韩| 一本大道av伊人久久综合| 老**午夜毛片一区二区三区| 国产精品免费福利| 在线综合视频| 欧美国产在线视频| 久久久久久亚洲精品中文字幕| 国产精品乱码妇女bbbb| 99国产精品一区|