2012-09-11 115 views
1

我在XNA中工作,我遇到了以下問題:我的目標是將多個不同紋理繪製到紋理,然後將最終紋理繪製到屏幕上給定的alpha值。渲染到紋理填充XNA中的顏色紋理

問題是,我繪製的紋理是全屏幕,並填充顏色而不是透明度,因此它會遮擋它後面的所有內容。

一切都是2D,這裏是我的代碼:

public void Draw(SpriteBatch sb) 
      { 
      if (opacity > 0) 
       { 
       gd.SetRenderTarget(formTexture); 
       gd.Clear(Color.Transparent); 
       for (int i=0; i<formItems.Count; i++) 
        { 
        ((FormItem)formItems[i]).draw(sb); 
        } 
       sb.Begin(SpriteSortMode.Immediate, BlendState.Additive); 
        for (int i=0; i<formItems.Count; i++) 
         { 
         FormItem fi = (formItems[i] as FormItem); 
         if (fi.glow != null) 
          { 
          sb.Draw(fi.glow, new Rectangle((int) fi.location.X + fi.width/2 - fi.glow.Width/2, (int) fi.location.Y + fi.height/2 - fi.glow.Height/2, fi.glow.Width, fi.glow.Height), Color.White); 
          } 
         } 
       sb.End(); 
       gd.SetRenderTarget(null); 
       sb.Begin(); 
       sb.Draw(formTexture, new Rectangle(0, 0, gd.Viewport.Width, gd.Viewport.Height), Color.White*opacity); 
       sb.End(); 
       } 
      } 

formTexture是RenderTarget2D對象,GD是圖形設備。這是formTexture如何初始化:

formTexture = new RenderTarget2D(this.gd, this.windowWidth, this.windowHeight); 

回答

1

的問題,你遇到的是設置渲染目標 - 和後備緩衝算作渲染目標 - 將清除渲染目標

至少是否設置了RenderTargetUsage.DiscardContentsMSDN)。這是默認設置,因爲它是唯一一款在Xbox 360上表現良好,保留內容需要昂貴的副本。 (這是Windows上的默認行爲,只是保持行爲相同的跨平臺)。

你的後備緩衝被清除了「哎呦,這是一個新的緩衝液」在這條線的顏色(通常爲紫色):

gd.SetRenderTarget(null); 

有兩種方法來解決這個問題:

首選方法是將所有渲染命令排序,以便在幀的開始處設置渲染目標,然後將場景繪製到後端緩衝區。切勿多次觸摸渲染目標。


另一種方式是將事件附加到GraphicsDeviceManager.PreparingDeviceSettings那臺後備緩衝使用RenderTargetUsage.PreserveContents

void SetBackbufferPreserveContents(object sender, 
            PreparingDeviceSettingsEventArgs e) 
{ 
    e.GraphicsDeviceInformation.PresentationParameters.RenderTargetUsage 
      = RenderTargetUsage.PreserveContents; 
} 

// in your game constructor: 
graphics.PreparingDeviceSettings += SetBackbufferPreserveContents; 

如果你的遊戲exclusivly目標的Windows時,才應使用第二種方法。

+0

謝謝,這是一個僅限Windows的遊戲,我會試試這個。 –