Posts Tagged ‘ XNA

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

XNA:粒子系統–雨效果0

現在開始用XNA寫一個粒子系統來實現雨和雪的效果,用XML文件來保存粒子系統相應的屬性.

由於對於C#的了解才剛剛開始,因此在一些C#細小的環節上還是有些小問題.

來吧,首先要解決的就是如何加載和寫入XML檔.

using System.Xml.XPath;
using System.Xml;
.....
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(@"ContentMouse.xml");

            XmlNode root = xmlDoc.SelectSingleNode("MouseSettings");
            XmlNode pos = root.SelectSingleNode("FlySpeed");

            float i = float(pos.InnerText);

讀取XML元素就這些代碼,讀取出來的都是string值,轉換成我們對應的int/float等等值就可以.

一個粒子系統有發射器,影響器,收集器和渲染器等幾部分組成,正在一個接著一個的創作中.

第一篇關於這個粒子系統的網誌就到這裡,我知道有點短,就純粹是看我在吐槽吧,哈哈哈哈哈.

另外,似乎DirectX SDK 2010 June 版本的已經把DirectX Viewer這個X格式模型查看工具給去掉了,微軟這是在宣稱X模型已經快走到盡頭了麼?
;-)

XNA學習筆記0

學習XNA已經很多天了,話說一直居然沒有寫一個學習筆記,其實也是找不到什麼好寫,似乎就是那樣的,不知道要寫什麼.

C#語言之前也完全不熟悉,也是邊學XNA變學C#,不過感覺學了XNA之後,也加深了我對GPU的渲染流程的理解.

看XNA的教程無論是XNA 3.0 Game Programming Recipes還是Professional XNA Game Programming,最開始的時候都讓人莫名其妙的,似乎不是在講述一個圖形API,因為書的結構似乎不是我之前所看過的OpenGL/DirectX的書那樣的結構.

另外,無論之前看OpenGL還是DirectX還是OGRE的教程,都沒有感覺像XNA的學習一樣如此多的Shader在我的周圍.

Read more

HLSL 學習中

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

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

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

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

下面的代碼:
Read more

return top