2010-07-17 6 views
5

Ich versuche, RenderTargets zur Laufzeit zu ändern, so dass ich einige Elemente zur Laufzeit zeichnen, manipulieren und schließlich die Textur auf den Bildschirm zeichnen kann. Problem ist, der Bildschirm wird violett, wenn ich das RenderTarget zur Laufzeit ändere. Hier ist der Code, den ich in Draw habe:RenderTarget-Ergebnisse in Purple Screen ändern?

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

Es nicht egal scheint, wie ich die RenderTarget schaffen, wenn ich es zur Laufzeit zu tun (und ich brauche In-Memory-Texturen zur Laufzeit erstellen und Zeichnen Sie mit SpriteBatch auf sie auf, es ergibt sich ein völlig lila Bildschirm. Was kann ich tun, um das zu beheben?

Antwort

3

Es sieht so aus, als ob die beste Option darin besteht, das RenderTarget anders als Draw zu erstellen, während des Updates zu zeichnen, die resultierende Textur zu speichern (und gegebenenfalls zu manipulieren) und dann diese Textur während des Zeichnens zu zeichnen.

+1

Das war mein Problem. Kennst du den Grund, warum es nicht in der Draw-Methode gemacht werden kann, oder warum die Farbe lila ist? –

+1

Danke an unsere Google Overlords für die automatische Vervollständigung von "xna renderertarget" mit "purple". Ich habe meinen Call-Draw-Szenen-Graph in 'PreDraw-> Clear-> Draw' aufgeteilt und zeichne während' PreDraw' in das Render-Ziel. [Shawn Hargreaves antwortete] (http://xboxforums.create.msdn.com/forums/t/6264.aspx), dass dies [das Zielverhalten zwischen Windows und XBOX konsistent machen soll] (http: //blogs.msdn). com/b/shawnhar/archiv/2007/11/21/rendertarget-änderungen-in-xna-game-studio-2-0.aspx). Von diesem letzten Link scheint es _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ | – cod3monk3y

1

Wenn spritebatch.End() aufgerufen wird, werden Objekte in den Backbuffer oder in Ihrem Fall in tempTarget geschrieben. Um die Textur zu machen,

  • Änderung der Ziel
  • Anruf beginnen
  • Anruf alle Auslosungen
  • die Spritebatch beenden
  • eingestellten Ziel

dann auf null zurück verwenden die render2d

+0

Ich benutze nicht einmal SpriteBatch - ich rufe nur 'GraphicsDevice.SetRenderTarget (buffer);' gefolgt von 'GraphicsDevice.SetRenderTarget (null);' - Wenn ich es vor allem anderen in Draw mache, funktioniert es, aber wenn ich es am Ende mache, wird alles lila. Ich denke, es hat etwas damit zu tun, dass Seitenumblätter in XNA 4.0 automatisch sind. : -/ – BrainSlugs83

2

Ich weiß, das ist spät, aber die Lösung ist zu schreiben zum RenderTarget, BEVOR Sie den Bildschirm leeren und mit dem Zeichnen Ihrer anderen Objekte beginnen.

Dies sollte verhindern, dass Sie in der Update-Methode, wie von anderen vorgeschlagen, rendern, die in vielerlei Hinsicht kontraintuitiv ist.

+2

Ich denke, diese Antwort verdient mehr Aufmerksamkeit, und ich würde wirklich gerne herausfinden, warum das passiert. Es scheint wie Stammeswissen. – Fibericon

+0

Ja, ich bin selbst dazu gestolpert. Ich mag es nicht. Ich möchte mein Ziel inline darstellen. : - / – BrainSlugs83