2010-07-17 14 views
5

Sto tentando di modificare RenderTargets in fase di runtime, quindi posso disegnare alcuni elementi in fase di runtime, manipolarli e infine disegnare la texture sullo schermo. Il problema è che lo schermo diventa viola se cambio il RenderTarget in fase di runtime. Ecco il codice che ho in Draw:Modifica dei risultati RenderTarget nella schermata viola?

 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); 

Non sembra avere importanza come creo il RenderTarget, se lo faccio a tempo di esecuzione (e ho bisogno di creare texture in memoria in fase di esecuzione e disegnare su di loro con SpriteBatch) si traduce in una schermata interamente viola. Cosa posso fare per risolvere questo problema?

risposta

3

Sembra che l'opzione migliore sia quella di creare il RenderTarget in un punto diverso da Disegna, disegnare su di esso durante l'aggiornamento, salvare la trama risultante (e manipolare se necessario) e disegnare quella texture durante il disegno.

+1

Questo era il mio problema. Conoscete il motivo per cui non può essere eseguito nel metodo di disegno o perché il colore è viola? –

+1

Grazie ai nostri signori di google per il completamento automatico di "xna rendertarget" con "purple". Ho separato la mia call graph 'Draw' in' PreDraw-> Clear-> Draw' e ho disegnato nel target di rendering durante 'PreDraw'. [Shawn Hargreaves ha risposto] (http://xboxforums.create.msdn.com/forums/t/6264.aspx) che si tratta di rendere [il comportamento di destinazione del rendering coerente tra Windows e XBOX] (http: //blogs.msdn. COM/B/shawnhar/archive/2007/11/21/renderTarget-cambiamenti-in-XNA-game-studio-2-0.aspx). Da quest'ultimo collegamento, sembra che _might_ sia anche possibile utilizzare 'RenderTargetUsage.PreserveContents' al costo delle prestazioni. – cod3monk3y

1

Quando spritebatch.End() viene chiamato oggetti vengono scritti nel backbuffer o nel tuo caso su tempTarget. Per rendere la texture,

  • cambiamento l'obiettivo
  • chiamata iniziare
  • chiamata tutte le estrazioni
  • terminare la SpriteBatch
  • obiettivo fissato di nuovo su null

quindi utilizzare il render2d

+0

Non sto nemmeno usando SpriteBatch - sto solo chiamando 'GraphicsDevice.SetRenderTarget (buffer);' seguito da 'GraphicsDevice.SetRenderTarget (null);' - se lo faccio prima di qualsiasi altra cosa in Draw, funziona, ma se lo faccio alla fine, tutto diventa viola ~ ish. Penso che abbia qualcosa a che fare con il page flipping essere automatico in XNA 4.0. : -/ – BrainSlugs83

2

So che è tardi, ma la soluzione è scrivere al RenderTarget PRIMA cancellare lo schermo e iniziare a disegnare gli altri oggetti.

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 
    //... 
} 

Questo dovrebbe impedire il rendering nel metodo di aggiornamento come suggerito da altri, il che è contro-intuitivo in molti aspetti.

+2

Penso che questa risposta meriti più attenzione, e mi piacerebbe davvero scoprire perché questo accade. Sembra una conoscenza tribale. – Fibericon

+0

Sì, mi sono imbattuto in questo me stesso. Non mi piace. Voglio rendere il mio obiettivo in linea. : - / – BrainSlugs83

Problemi correlati