2010-07-17 16 views
5

Çalışma zamanında RenderTargets'ı değiştirmeye çalışıyorum, bu yüzden çalışma zamanında bazı öğeleri çizebilir, bunları değiştirebilir ve ardından dokuyu ekrana çizebilirim. Sorun şu ki, çalışma zamanında RenderTarget'i değiştirirsem ekran mor olur. İşte Draw var kod: I (zamanında yaparsanız ben RenderTarget oluşturmak ne kadar da görünmüyorMor Ekranda RenderTarget Sonuçlarını Değiştirme?

 RenderTarget2D tempTarget = new RenderTarget2D(GraphicsDevice, 128, 128, 1, 
      GraphicsDevice.DisplayMode.Format, GraphicsDevice.PresentationParameters.MultiSampleType, 
      GraphicsDevice.PresentationParameters.MultiSampleQuality, RenderTargetUsage.PreserveContents); 

     GraphicsDevice.SetRenderTarget(0, tempTarget); 
     GraphicsDevice.Clear(ClearOptions.Target, Color.SpringGreen, 0, 0); 
     GraphicsDevice.SetRenderTarget(0, null); 

Maddeye ve zamanında bellek içi dokuları oluşturmak gerekiyor ve SpriteBatch ile çizin) tamamen mor bir ekran ile sonuçlanır. Bunu düzeltmek için ne yapabilirim?

cevap

3

En iyi seçenek, RenderTarget'i Draw dışında başka bir yerde oluşturmak, Güncelleştirme sırasında çizmek, sonuçta oluşan dokuyu kaydetmek (ve gerektiğinde manipüle etmek) sonra bu dokuyu Çizme sırasında çizmektir.

+1

Bu benim sorunumdu. Çizim yönteminde yapamayacağının nedenini biliyor musunuz, yoksa rengin neden mor olduğunu biliyor musunuz? –

+1

"xna rendertarget" 'i otomatik tamamlama için google overlords'a teşekkürler. 'Draw' sahne grafiği çağrısını 'PreDraw-> Clear-> Draw' olarak ayırdım ve 'PreDraw' sırasında render hedefine çizdim. [Shawn Hargreaves yanıt verdi] (http://xboxforums.create.msdn.com/forums/t/6264.aspx), bunun [hedeflenen davranışı Windows ve XBOX arasında tutarlı hale getirmesi] yapmaktır (http: //blogs.msdn. com/b/shawnhar/arşiv/2007/11/21/rendertarget-değişimler-in-xNA oyun-stüdyo-2-0.aspx). Bu son bağlantıdan, _might_'ın performans maliyetinde 'RenderTargetUsage.PreserveContents'ı da kullanması mümkün görünmektedir. – cod3monk3y

1

spritebatch.End() çağrıldığında, backbuffer'a veya sizin durumunuzda tempTarget'a yazılır. doku yapmak için,

  • değişiklik hedef
  • çağrı geri
  • set hedef kullanmak sonra

null tüm

  • SpriteBatch sona çizer
  • aramayı başlatmak render2d

  • +0

    Hatta SpriteBatch kullanmıyorum - Ben sadece 'GraphicsDevice.SetRenderTarget (buffer);' 'GraphicsDevice.SetRenderTarget (null); sonra Draw-başka bir şey yapmadan önce yaparsanız, çalışır - ama sonunda yaparsam, hepsi mor olur. XNA 4.0'da otomatik olarak sayfa çevirme ile ilgili bir şey olduğunu düşünüyorum. : -/ – BrainSlugs83

    2

    Geç olduğunu biliyorum, ama çözüm yazmaktır Ekranı temizlemeden ve diğer öğelerinizi çizmeye başlamadan ÖNCE RenderTarget'a. karşı sezgisel birçok yönden olduğu başkaları tarafından önerildiği gibi

    protected override void Draw(GameTime gameTime) 
    { 
        GraphicsDevice.SetRenderTarget(_renderTarget); 
    
        //... 
        //Perform Rendering to the specified target 
        //... 
    
        GraphicsDevice.SetRenderTarget(null); 
    
        GraphicsDevice.Clear(Color.CornflowerBlue); 
    
        //... 
        //Code that draws to the users screen goes here 
        //... 
    } 
    

    Bu Güncelleme yönteminde render engelleyebilir gerekir.

    +2

    Bu cevabın daha fazla dikkat etmeyi hak ettiğini düşünüyorum ve bunun neden olduğunu öğrenmek isterim. Aşiret bilgisi gibi görünüyor. – Fibericon

    +0

    Evet, buna kendim geldim. Beğenmedim. Hedefi satır içi hale getirmek istiyorum. : - / – BrainSlugs83

    İlgili konular