2012-01-03 2 views
5

XNAを使用して2DスプライトベースのWindowsゲームを作成し始めました。私はまだそれほど経験はありませんが、私は学んでいます。私はXNAゲームスタジオ3.1を使用していて、私はまだ4.0にアップデートしていないと言って始めましょう。XNAでRenderTarget2Dを使用すると、色が正しくない

私が達成しようとしているのは、固定サイズのバッファにすべてのスプライトを描画できるようにすることです。レンダリングパスの最後に、実際のバックバッファのサイズにスケーリングしてから描画します。私はどのように複数の解像度が通常サポートされているか分かりませんが、それは私にとっては適切な解決策のようです。

RenderTarget2Dオブジェクトを使用してすべての要素を描画し、それからTexture2Dを取得し、バックバッファに描画することで、これを達成しようとしました。

私のコードは次のようになります。

private RenderTarget2D RenderTarget; 
private DepthStencilBuffer DepthStencilBufferRenderTarget; 
private DepthStencilBuffer DepthStencilBufferOriginal; 
private SpriteBatch SpriteBatch; 

protected override void Initialize() 
{ 
    base.Initialize(); 
    RenderTarget = new RenderTarget2D(GraphicsDevice, 1920, 1080, 1, SurfaceFormat.Single); 

    DepthStencilBufferRenderTarget = new DepthStencilBuffer(GraphicsDevice, 
    1920, 1080, GraphicsDevice.DepthStencilBuffer.Format); 

    DepthStencilBufferOriginal = GraphicsDevice.DepthStencilBuffer; 
    SpriteBatch = new SpriteBatch(GraphicsDevice); 
} 

protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.DepthStencilBuffer = DepthStencilBufferRenderTarget; 
    GraphicsDevice.SetRenderTarget(0, RenderTarget); 
    GraphicsDevice.Clear(Color.Black); 

    SpriteBatch.Begin(); 
    //drawing all stuff here 
    SpriteBatch.End(); 

    GraphicsDevice.DepthStencilBuffer = DepthStencilBufferOriginal; 
    GraphicsDevice.SetRenderTarget(0, null); 
    GraphicsDevice.Clear(Color.Black); 
    Texture2D output = RenderTarget.GetTexture(); 

    SpriteBatch.Begin(); 
    Rectangle backbuffer = new Rectangle(0, 0, m_Options.DisplayWidth, m_Options.DisplayHeight); 
    SpriteBatch.Draw(output, backbuffer, Color.White); 
    SpriteBatch.End(); 

    base.Draw(gameTime); 
} 

私が遭遇した問題は、色はすべて間違っているということです。以下は2つのスクリーンショットを示す画像です:最初は、どのように見えるのかのスクリーンショットです(私は独自のスケーリングアルゴリズムを書き、それまでは各スプライトを単純にスケーリングしていました)、RenderTarget2Dを使用したときの見た目です。

Example of what's wrong

誰も私が間違ってやっている知っていますか?

+1

これは難しいことです...レンダリングターゲットのTexture2Dをファイルに保存してみましょう(Texture2Dには保存用のメソッドがあります)。ターゲットにゲームを描画しているときに問題が発生しているかどうかを確認するために、 (つまり、保存された画像がうまく見える場合、問題は画面に描画されています)。 –

+0

こんにちは、私はあなたが言ったことをして、レンダリングターゲットのtexture2Dは、間違った色でスクリーンショットにあるように正確に見えます。だから明らかに、このレンダリングターゲットに描画することに問題があります。 – Jerry

答えて

2

私は私が間違ったことを考え出しました。私は、新しいRenderTarget2Dインスタンスを作成するときに、間違ったSurfaceFormatを使用したと思います。私はSurfaceFormat.Singleを使用しましたが、SurfaceFormat.Colorを使用してください。

私は新しいレンダーターゲットを設定する前に、デバッグしながら、時計を通じてのGraphicsDeviceのPresentationParametersを見てとることで、これを考え出し:

GraphicsDevice.PresentationParameters.BackBufferFormat 

は、これはそれがSurfaceFormat.Colorに設定された私に言いました。そこで、SurfaceFormat.SingleをSurfaceFormat.Colorに置き換えました。

+0

将来の読者の方へ:これを読んだときに何がうまくいかなかったのは明らかです。http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.surfaceformat.aspx SurfaceFormat.Colorはシンプルです32ビットのRGBA色空間、SurfaceFormat.Singleは32ビットの浮動小数点形式で、赤色のチャネルは32ビットです。 – Jerry

+0

私は一般に、プレゼンテーションを明示的に指定することなく[RenderTarget2Dコンストラクタ](http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.rendertarget2d.rendertarget2d.aspx)を使用することをお勧めしますパラメーター。 – user1306322

関連する問題