基於DIRECTX的3D粒子系統構建 2

2021-04-30 07:17:50 字數 2569 閱讀 9385

三、在directx9.0環境下粒子系統的實現

這一節,筆者將會介紹在directx9.0

環境下如何實現乙個簡單的粒子系統,並著重對point sprites粒子型別作詳細說明。

1、point sprites粒子結構

首先來看乙個point sprites粒子是如何定義的:

//乙個point sprites粒子的頂點結構

typedef struct

pointspritevertex, *lppointspritevertex;

//乙個point sprites的結構

typedef struct

pointsprite, *lppointsprite;

2、point sprites粒子的渲染狀態

pd3ddevice->setrenderstate(d3drs_pointspriteenable, true);

d3drs_pointspriteenable這個渲染狀態,當設定為true時,貼圖會完全貼上point sprites粒子;如果設定為false,那麼,當粒子的頂點結構中有uv座標時貼圖才有效,並且根據不同粒子的uv座標貼到不同的位置。

pd3ddevice->setrenderstate(d3drs_pointscaleenable, true);

d3drs_pointscaleenable這個渲染狀態,當設定為true時,粒子的大小會受攝象機位置的影響,也就是有正確的透視關係,攝象機離這個粒子越遠,粒子越小;如果設定為false,那麼粒子將不受攝象機位置的影響,如果這時你設定粒子大小為3,那麼這個粒子將始終佔據3*3象素大小的螢幕面積。

pd3ddevice->setrenderstate(d3drs_pointsize, ftodw(fscale));

d3drs_pointsize設定粒子的大小(視d3drs_pointscaleenable設定的不同,有可能是螢幕大小也有可能是攝象機空間大小)。這個大小是從pointsprite的size變數獲得。需要注意的是必須把變數轉換為dword。

pd3ddevice->setrenderstate(d3drs_pointsize_min, ftodw(0.0f));

d3drs_pointsize_min設定粒子的最小大小,這裡設為0,並同樣轉換為dword傳入。

pd3ddevice->setrenderstate(d3drs_pointsize_min, ftodw(10.0f));

d3drs_pointsize_min設定粒子的最大大小,這裡設為10,並轉換為dword傳入。

d3drs_pointscale_a,

d3drs_pointscale_b,

d3drs_pointscale_c

這三個引數定義當攝象機移動時粒子的大小該如何變化。direct3d

採用以下公式計算粒子的最終顯示大小:

其中:viewportheight

是視口的高度,size是d3drs_pointsize設定的大小,a,b,c是

d3drs_pointscale_a,

d3drs_pointscale_b,

d3drs_pointscale_c

這三個引數設定的大小,

d是粒子離攝象機的距離。

這個大小的計算是

曾經困擾筆者的乙個難點,如果要詳細了解這樣設定的意義…….問微軟的人去!

不過,對於簡單的應用沒那麼麻煩,按下面的設定你能得到正確的效果:

// control the size of the particle relative to distance

pd3ddevice->setrenderstate(d3drs_pointscale_a, ftodw(0.0f));

pd3ddevice->setrenderstate(d3drs_pointscale_b, ftodw(0.0f));

pd3ddevice->setrenderstate(d3drs_pointscale_c, ftodw(1.0f));

上面我們介紹了基本point sprites粒子的結構和渲染過程(部分翻譯自《introduction.to.3d.game.programming.with.directx.9.0》一書),可以說我們已經有了一些威力巨大的子彈,下面我們看看槍是怎麼製作的。

粒子系統 3D粒子

你現在可能已經知道了,2d和3d在godot中是彼此的映象。凡是2d中存在的節點,在3d中也存在。所以,自然而然地,particles2d節點有乙個3d的替代品,叫做particles節點。particles節點會發出3d粒子。它不需要紋理,而是需要乙個網格。然而,如果你在屬性中檢視,你會發現不是乙...

3D數學 座標系

什麼是多座標系?用處是什麼?顧名思義,多座標係指在同一空間的不同座標系。如下圖為了繪製不同的幾何體,有時需要更換乙個相對容易繪製的座標系,這就形成了多座標系。該如何表示各種座標系關係?在遊戲模型中,為了表達乙個模型各個部位,需要建立多座標系。而這些不同的座標系又有巢狀關係 如耳朵座標系巢狀在頭部座標...

基於WebGL架構的3D視覺化平台 新風系統演示

新風系統是根據在密閉的室內一側用專用裝置向室內送新風,再從另一側由專用裝置向室外排出,在室內會形成 新風流動場 從而滿足室內新風換氣的需要。實施方案是 採用高風壓 大流量風機 依靠機械強力由一側向室內送風,由另一側用專門設計的排風風機向室外排出的方式強迫在系統內形成新風流動場。在送風的同時對進入室內...