ゲーム開発技術 フォーラム > XNA Game Studio Express > RenderTarget2Dを使用すると背景が紫色に

回答済み RenderTarget2Dを使用すると背景が紫色に

  • 2009年4月9日 16:33
     
      コードあり
    XNA3.0のWin用プロジェクトで
    テクスチャへのレンダリングを試しているのですが、
    なぜかデフォルトのバックバッファの方が紫色にクリアされてしまいます。

            protected override void Initialize()
            {
                // TODO: Add your initialization logic here
                font = Content.Load<SpriteFont>("SpriteFont1");
                renderTarget = new RenderTarget2D(graphics.GraphicsDevice, 300, 300, 1, SurfaceFormat.Color);
                
                base.Initialize();
            }
    
            protected override void Draw(GameTime gameTime)
            {
                GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // TODO: Add your drawing code here
                RenderToRenderTarget();
    
                spriteBatch.Begin();
                spriteBatch.Draw(renderTarget.GetTexture(), new Rectangle(100, 100, 300, 300), Color.White);
                spriteBatch.DrawString(font, "default BackBuffer", Vector2.Zero, Color.White);
                spriteBatch.End();
    
                base.Draw(gameTime);
            }
    
            private void RenderToRenderTarget()
            {
                GraphicsDevice.SetRenderTarget(0, renderTarget);
    
                GraphicsDevice.Clear(Color.Gray);
    
                spriteBatch.Begin();
                spriteBatch.DrawString(font, "render target", new Vector2(0, 0), Color.White);
                spriteBatch.End();
    
                GraphicsDevice.SetRenderTarget(0, null);
            }
    デフォルトのバックバッファが紫になる以外はうまく動いているようですが、
    原因が分かる方がいらっしゃいましたら教えてください。
    よろしくお願いします。

回答

  • 2009年4月9日 18:56
     
     回答済み

    Drawメソッド内の最初のGraphicsDevice.Clear(Color.CornflowerBlur)をRenderToRenderTargetの後に記述すれば解決します。


    紫色になるのは、Xbox 360とWindows間でレンダーターゲットの振る舞いを一緒にするために起きる現象です。
    レンダーターゲットを切り替えた時、Windows上の場合はレンダーターゲット内の内容は保持されますが、
    Xbox 360上ではeDRAM上に描画するので、その内容は破棄されてしまいます。

    XNA GS 2.0以降では、デフォルトではXbox 360上の振る舞いをし、破棄されているということを表すために
    レンダーターゲットを切り替えたときに、新しいレンダーターゲットを紫色にクリアします。(クリア自体は非常に速い処理です)

    この振る舞いはPresentationParameters.RenderTargetUsageによって変更することができます。
    http://msdn.microsoft.com/ja-jp/library/microsoft.xna.framework.graphics.rendertargetusage.aspx

    デフォルトではDiscardContentsになっています。
    PlatformContentsはプラットフォーム毎の振る舞いに合わせたコードを書かないといけないので、あまりお勧めできません。
    また、PreserveContentsはWindows上では余計なコストは掛かりませんが、Xbox 360上では内容を保持する為の処理が入るので速度的に不利になってしまいます。

    以上のことから、デフォルトのDiscardContentsを使うのをお勧めします。


    XNA Framework Developer
    • 回答としてマーク oreore 2009年4月11日 1:44
    •  

すべての返信

  • 2009年4月9日 18:56
     
     回答済み

    Drawメソッド内の最初のGraphicsDevice.Clear(Color.CornflowerBlur)をRenderToRenderTargetの後に記述すれば解決します。


    紫色になるのは、Xbox 360とWindows間でレンダーターゲットの振る舞いを一緒にするために起きる現象です。
    レンダーターゲットを切り替えた時、Windows上の場合はレンダーターゲット内の内容は保持されますが、
    Xbox 360上ではeDRAM上に描画するので、その内容は破棄されてしまいます。

    XNA GS 2.0以降では、デフォルトではXbox 360上の振る舞いをし、破棄されているということを表すために
    レンダーターゲットを切り替えたときに、新しいレンダーターゲットを紫色にクリアします。(クリア自体は非常に速い処理です)

    この振る舞いはPresentationParameters.RenderTargetUsageによって変更することができます。
    http://msdn.microsoft.com/ja-jp/library/microsoft.xna.framework.graphics.rendertargetusage.aspx

    デフォルトではDiscardContentsになっています。
    PlatformContentsはプラットフォーム毎の振る舞いに合わせたコードを書かないといけないので、あまりお勧めできません。
    また、PreserveContentsはWindows上では余計なコストは掛かりませんが、Xbox 360上では内容を保持する為の処理が入るので速度的に不利になってしまいます。

    以上のことから、デフォルトのDiscardContentsを使うのをお勧めします。


    XNA Framework Developer
    • 回答としてマーク oreore 2009年4月11日 1:44
    •  
  • 2009年4月10日 2:08
     
     

    いつもお世話になります。
    教えていただいた方法で解決しました。
    ありがとうございました。