XNA-2D SpriteBatch.Begin 和 SpriteBatch.End

XNA-2D SpriteBatch.Begin和SpriteBatch.End

 

前面說到畫圖需要呼叫的SpriteBatch.Draw函式,必須用SpriteBatch.Begin和SpriteBatch.End這兩個函式包起來,

SpriteBatch.Begin有四種多載,其實只是參數依序變多而已,所以直接介紹最多的那個。

 

一.SpriteBatch.Begin (SpriteBlendMode, SpriteSortMode, SaveStateMode, Matrix)

第一個參數混合模式(blendMode),他是一個列舉型態(enum),有三個值Additive、AlphaBlend、None。

主要是用來計算顏色的混和,遊戲中最常用的顏色表示法就是RGBA,其中R是紅色、G是綠色、B是藍色、A是alpha值也就是透明度,

每個顏色佔1byte,值是0-255,透明度0是看不到而255是完全不透明,白色的rgb是255,255,255,而黑色的是0,0,0。

以後沒特別提到透明度的話,都當他是255。

而xna在畫圖時會計算要畫出的顏色,公式為「新顏色=來源混和數 * 來源顏色 + 目標混和數*目標顏色」(NewColor = SourceBlend*SourceColor + DestBlend*DestColor)。

來源顏色為我們準備要畫的像素的顏色,目標顏色為已經畫出來在畫面上的像素顏色(精確一點的說法是已經在buffer中將要顯示在畫面上的顏色),

計算時會使用標準化的顏色數值,標準化就是把RGBA都除以255,所得到的結果為0到1的float,

設定成AlphaBlend,此時會用來源圖的alpha值當做來源混和數,將(1-alpha)當做目標混和數,

如果我們要畫的像素alpha為255也就是完全不透明(標準化為1),此時新顏色=1*SourceColor  + 0*DestColor,也就是來源的顏色,

相反地要畫透明度為0的像素,新顏色=0*SourceColor  + 1*DestColor,就變成原來在畫面上的顏色了,半透明也是一樣的道理。

而Additive是將來源混和數(SourceBlend)和目標混和數(DestBlend)都設為1,

新顏色就變成1*SourceColor  + 1*DestColor,這樣重疊黑色會沒變化,疊上別的顏色會越加越亮,適合用來作光暈或爆炸的效果。

若設定成None,則來源混和數(SourceBlend)為1,目標混和數(DestBlend)為0。

 

第二個參數影響的是繪圖的順序(sortMode),有五個值BackToFront、FrontToBack、Deferred、Texture、Immediate,預設值為Deferred。

BackToFront表示越後面呼叫draw的圖會先畫,有設定深度的話0是前面(front)1是後面(back),所以數字大的會先畫,深度優先權大於呼叫draw的順序,先畫的結果就是會被蓋掉。

FrontToBack則相反,先呼叫draw的圖會先畫,深度數字較小的會先畫,深度優先權大於呼叫draw的順序,當然,先畫的結果就是會被覆蓋掉。

Deferred是先呼叫draw的圖會先畫,不管深度。

Texture為後呼叫draw的圖會先畫,不管深度,且對於畫相同深度不互相重疊的圖有更好的效能。

上面四種設定,都會在呼叫SpriteBatch.End時,才將圖畫到螢幕上。

Immediate就會是呼叫完draw就馬上畫出來。

 

第三個參數(stateMode)是用來決定要不要將這些繪圖狀態儲存起來,因為在畫3D圖時,有可能會把設定改變掉,將設定存起來的話,每次畫到這就會取出設定。

第四個參數轉換陣列(transformMatrix),可以使用此轉換陣列將此區塊(Begin到End)之間的圖全都做相同的位移、旋轉、縮放、深度改變等。

 

二.SpriteBatch.End ( )

只有一個功能,表示呼叫Draw函式結束。