Posts Tagged ‘ HLSL

XNA:粒子系統–雨效果3-開始掉坦克

在前面的一些內容,我已經構建了一個基本的粒子系統,儘管她還不能運動,現在讓我來完善她,讓她開始運動起來,也就是說,從天上掉下很多坦克下來.

之前我們是通過GPU實現,坦克自然是一個模型,通過Vertex Shader運算之後重新得到每個模型運動的位置.

注意,這裡用到了一個很笨拙的方法,逐個計算Tank模型每個頂點的位置,其實可以通過計算中心點坐標來減少計算量.

之前已經說過,計算目的地坐標的公式為:vt+g*t*t/2.

我們在Shader裡面設置全局變量:

float LifeTime;  //粒子生命時間
float InitialSpeed;  //初始速度
float Acceleration;  //加速度

然後計算坐標僅為:

inPos.y-=(LifeTime*InitialSpeed+(Acceleration*LifeTime*LifeTime)/2);
Output.Position = mul(inPos, preWorldViewProjection);

即可完成運動計算.

完整的Shader代碼:
Read more

XNA:粒子系統–雨效果2-讓天空佈滿粒子元

經過上一次的GPU實習思考之後,下面我們開始具體的代碼編寫。

1.初始化每個粒子的坐標,初始速度.

2.將粒子佈滿天空.

3.施加重力,讓粒子往下落.

4.結束粒子的生命,並重新生成.

我們來看粒子的類:

    public class Particle
    {
        //粒子的位置
        public bool isActive;
        //粒子的位置
        private Vector3 position;
        public Vector3 Position
        {
            set { position = value; }
            get { return position; }
        }
        //粒子速度
        private Vector3 velocity;
        public Vector3 Velocity
        {
            set { velocity = value; }
            get { return velocity; }
        }
        //粒子的生命值
        private float lifetime;
        public float Lifetime
        {
            set { lifetime = value; }
            get { return lifetime; }
        }
        // 实例一个粒子
        public Particle(Vector3 position, Vector3 velocity)
        {
            this.position = position;
            this.velocity = velocity;
            isActive = true;
        }
    }

Read more

XNA:粒子系統–雨效果1-GPU實現思考

現在繼續完善中,想用GPU運算的方式實現出來,用GPU運算粒子當前的坐標,又分為狀態無關和狀態有關兩種粒子,由於是DirectX 9.0的Shader,Vertex Shaders是無法返回值的,所以假如我們想使用迭代計算粒子當前的坐標值,僅僅依靠Vertex Shaders是無法做出來的,當然,DirectX 10中可以實現。在DirectX 9中,也可以借助Pixel Shaders進行Ping Pong紋理來保存當前的數據。這是狀態有關的GPU粒子系統.

下面來說說狀態無關的粒子系統,狀態有關的粒子系統則比較簡單,推導出相對應粒子位置公式,再傳入時間t即可計算出相對應的坐標。但是這樣的一個缺點就是,我們無法實時的去控制粒子了.

下面說說狀態無關的粒子系統,時間t,重力加速度g,初始速度v0,初始位置pos0,這樣根據中學的公式很容易就可以得出當前的位置公式:

pos1=pos0+vo*t+g*t*t/2.

這樣隨機每個vo值,就能實現各個粒子不同的運動速度,但是這樣粒子的噪聲卻是無法實現的,這個公式太簡單以至於只能在y軸運動.

Read more

HLSL 學習中

因為XNA的關係,所以Shader在裡面很常用的感覺,人家說使用了Shader之後能夠很短的代碼就能創造出很神奇絢麗的效果,於是開始學習HLSL,試試了一下,果然讓人驚訝.

頂點著色器Vertex Shaders的輸出結果就是像素著色器Pixel Shaders的輸入結果,這句話說的太直觀了.

頂點著色器Vertex Shaders可以被CPU模擬,如果你的GPU不支持的話,但是像素著色器Pixel Shaders就不能被CPU模擬.

在使用頂點著色器的時候有個小小的思考,我們的CPU在遍歷一個模型mesh或者圖元所有的頂點數據之後,再傳遞給頂點著色器,頂點著色器經過運算之後傳遞給像素著色器。這個時候就帶來一個問題,經過頂點著色器運算之後的頂點數據,CPU不知道了,也就是說,我們的程式不知道現在頂點是移動到什麼地方去了,儘管我們的眼睛可以看到。如果這樣,我們要做非常精確的碰撞檢測(不使用包圍體,當然這是一種理想的情況),這樣我們就無法得知每一個頂點精確位置了.

下面的代碼:
Read more

The Complete Effect and HLSL Guide 中文翻译

在逛GAMEDEV论坛的时候查看HLSL资料的时候发现了这位大牛自己翻译了The Complete Effect and HLSL Guide这本书,并且贴到了自己的CSDN博客上面,如此好物怎么能错过,贴个地址供膜拜用:http://blog.csdn.net/soilwork/archive/2006/11/22/1402960.aspx

关于HLSL的中文资料一直都非常稀少,发现这个也相当宝贵哈.

今天去了南昌的宝葫芦游乐场玩,很爽.

return top