2010-07-17 6 views
5

Estoy intentando cambiar RenderTargets en tiempo de ejecución, así que puedo dibujar algunos elementos en tiempo de ejecución, manipularlos y finalmente dibujar la textura en la pantalla. El problema es que la pantalla se vuelve morada si cambio RenderTarget en el tiempo de ejecución. Aquí está el código que tengo en Draw:¿Cambiar los resultados de RenderTarget en pantalla morada?

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

No parece importar cómo creo el RenderTarget, si lo hago en tiempo de ejecución (y yo lo necesito para crear texturas en memoria en tiempo de ejecución y dibujar sobre ellos con SpriteBatch) resulta en una pantalla totalmente violeta. ¿Qué puedo hacer para arreglar esto?

Respuesta

3

Parece que la mejor opción es crear el RenderTarget en otro lugar que no sea Dibujar, dibujar durante la Actualización, guardar la textura resultante (y manipularla según sea necesario) y luego dibujar esa textura durante el Dibujo.

+1

Este fue mi problema. ¿Sabes la razón por la que no se puede hacer en el método de sorteo, o por qué el color es de color púrpura? –

+1

Gracias a nuestros señores de Google por completar automáticamente "xna rendertarget" con "morado". Separé mi llamada a gráfico de escena 'Dibujar' en' PreDibujar-> Borrar-> Dibujar' y dibujar en el objetivo de renderizado durante 'PreDibujar'. [Shawn Hargreaves respondió] (http://xboxforums.create.msdn.com/forums/t/6264.aspx) que esto es para que [el comportamiento del objetivo de procesamiento sea coherente entre Windows y XBOX] (http: //blogs.msdn. com/b/shawnhar/archive/2007/11/21/rendertarget-changes-in-xna-game-studio-2-0.aspx). Desde ese último enlace, parece que también podría ser posible usar 'RenderTargetUsage.PreserveContents' al costo de rendimiento. – cod3monk3y

1

Cuando se llama spritebatch.End() los objetos se escriben en el backbuffer o en su caso en tempTarget. Para hacer la textura,

  • cambiar el objetivo
  • llamada comience
  • llamada de todos los sorteos
  • finalizar la SpriteBatch
  • objetivo fijado de nuevo a nulo

continuación, utilizar el render2d

+0

Ni siquiera estoy usando SpriteBatch; solo llamo a 'GraphicsDevice.SetRenderTarget (buffer);' seguido de 'GraphicsDevice.SetRenderTarget (null);' - si lo hago antes que cualquier otra cosa en Draw, funciona, pero si lo hago al final, todo se vuelve morado ~ ish. Creo que tiene algo que ver con el cambio de página automático en XNA 4.0. : -/ – BrainSlugs83

2

Sé que es tarde, pero la solución es escribir a RenderTarget ANTES de borrar la pantalla y comenzar a dibujar sus otros elementos.

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

Esto debe evitar que la representación en el método de actualización según lo sugerido por otros, lo cual es contrario a la intuición en muchos aspectos.

+2

Creo que esta respuesta merece más atención, y me encantaría saber por qué sucede esto. Parece conocimiento tribal. – Fibericon

+0

Sí, me encontré con esto yo mismo. No me gusta Quiero renderizar mi objetivo en línea. : - / – BrainSlugs83

Cuestiones relacionadas