天天看點

使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔

      Xna 4.0提供了多種方法實作shader特效,都通過類型Effect接口實作。這裡介紹一種通過代碼生成器生成Effect通路類型的方法。

實作自定義Shader特效的通常做法

      通常的做法是通過将實作shader的.fx檔案加入到Content項目中,在Build的過程中生成編譯完成的二進制.xnb資源檔案,接着在運作時載入這些Effect資源,并通過Effect接口進行shader變量的資料綁定。比如對于這樣的一個簡單的調整圖檔飽和度的特效SaturationEffect.fx:

sampler BaseSampler : register(s0);

float Saturation = 0.5f;

float4 PS(float2 texCoord : TEXCOORD0) : COLOR0
{
    float4 color = tex2D(BaseSampler, texCoord); 
    
    float grey = dot(color, float3(0.3, 0.59, 0.11));
        
    return lerp(grey, color, Saturation);
}

technique Default
{
    pass Pass1
    {
        PixelShader = compile ps_2_0 PS();
    }
}      

      在使用時,我們需要先載入,并用字元串引用來為變量Saturation指派:

Effect saturation = Content.Load<Effect>("SaturationEffect");

saturation.Parameters["Saturation"].SetValue(0.3f);      

      這種做法有兩點不完美的地方:一是通路變量需要通過字元串字典,增加了出錯的可能。二是編譯完成後的.fx檔案要作為資源檔案複制到可執行檔案的目錄下,不适合于類庫之類的應用(當然可以使用一種比較麻煩的辦法,就是将.xnb作為資源檔案嵌入到dll中,然後使用ResourceContentManager來載入)。     

使用EffectCustomTool實作自定義Shader特效

      由于Xna 4.0在Windows Phone 7平台上的實作使用OpenGl ES,是以上層的API不支援自定義HLSL特效,于是這個從1.0時代就孤身一人的BasicEffect終于有了3個兄弟姐妹:SkinnedEffect, DualTextureEffect和EnvironmentMapEffect(我們姑且認為DualTextureEffect和EnvironmentMapEffect是兩位男性,因為他們都比較花心,一個腳踏兩隻船,一個到處看美女;而SkinnedEffect是個女生,因為她比較在意保養自己的皮膚==!)。而通過使用EffectCustomTool,可以使得我們很容易的實作以這些内置特效的使用方法來使用我們自己的自定義特效(從此你可以在項目中讓Effect輕松又惬意的生出一個足球隊)。具體過程如下:

1下載下傳并安裝 EffectCustomTool for Visual Studio 2010

      最新版本的EffectCustomTool 1.2支援最新的Xna 4.0 Beta以及VisualStudio 2010(包括Visual CSharp Express 2010以及Visual Studio 2010 Express for Windows Phone),并修正了一些重命名的bug。 本文以Xna 4.0為例,如果你使用的是Xna 3.1,請下載下傳EffectCustomTool 1.1。

2打開Xna 4.0的遊戲項目,将需要使用的.fx檔案加入到遊戲項目中。注意,不是原來的Content項目。

使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔

3設定所使用的.fx檔案的CustomTool屬性為EffectCustomTool。

使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔

4右擊所使用的.fx檔案,選擇Run CustomTool。

使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔

5這時通路Shader的C#類就自動生成完畢。同時會生成兩個子檔案:.cs和.Designer.cs。

使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔

使用SpriteBatch和自定義Shader繪制特效圖檔

      Xna 4.0中的SpriteBatch增強了對自定義Effect的支援,使得我們可以很友善的為圖檔添加自定義特效。

1首先載入一張用于渲染的背景圖。同時我們像建立BasicEffect的方法一樣new出來一個SaturationEffect。并設定Saturation屬性為0.3f. 

protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);

    saturation = new SaturationEffect(GraphicsDevice);
    saturation.Saturation = 0.3f;

    background = Content.Load<Texture2D>("Background");
}      

2使用Xna 4.0中SpriteBatch的新特性來繪制自定義特效。

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin(SpriteSortMode.Immediate,
                      BlendState.Opaque,
                      SamplerState.AnisotropicWrap,
                      DepthStencilState.None,
                      RasterizerState.CullCounterClockwise,
                      saturation);

    spriteBatch.Draw(background, GraphicsDevice.Viewport.Bounds, Color.White);

    spriteBatch.End();

    base.Draw(gameTime);
}      

3原背景圖以及最終的繪制結果:

使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔
使用 EffectCustomTool 為 Xna 建立自定義 Shader 特效實作自定義Shader特效的通常做法使用EffectCustomTool實作自定義Shader特效使用SpriteBatch和自定義Shader繪制特效圖檔

4EffectCustomTool 1.2程式、代碼及示例下載下傳。

轉載于:https://www.cnblogs.com/yufeih/archive/2010/08/07/1794719.html

c#