2012-01-03 4 views
5

Я начал делать 2D-игру на основе спрайтов Windows с помощью XNA. Я еще не очень опытен, но я учусь. Позвольте мне начать с того, что я использую XNA game studio 3.1, я не обновил до 4.0 (пока).Цвета ошибочны при использовании RenderTarget2D в XNA

То, что я пытаюсь выполнить, состоит в том, чтобы иметь возможность рисовать все мои спрайты в буфере фиксированного размера, который затем в конце прохода рендеринга масштабируется до размера фактического буфера, а затем натягивается на этот , Я не уверен, как обычно поддерживается несколько резолюций, но это казалось мне адекватным решением.

Я попытался добиться этого, используя объект 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); 
} 

Проблема я сталкиваюсь, что цвета все не так. Ниже приведена картинка с двумя скриншотами: первый - это скриншот того, как он должен выглядеть (я написал свой собственный алгоритм масштабирования, перед которым просто масштабировался каждый спрайт сам по себе), и вправо он выглядит так, как он выглядит при использовании RenderTarget2D.

Example of what's wrong

Кто-нибудь знает, что я делаю неправильно?

+1

Это недоумение ... попробуйте сохранить текстуру Rendertarget's Texture2D в файл (Texture2D содержит методы для сохранения) и посмотрите, все еще синий, чтобы определить, является ли проблема, когда вы рисуете игру до цели или рисование цели на экране (т. е. если сохраненное изображение выглядит нормально, проблема заключается в рисовании на экран). –

+0

Привет, я сделал то, что вы сказали, и текстура rendertarget текстуры2D выглядит точно так же, как на скриншоте с неправильными цветами. Таким образом, очевидно, что проблема заключается в том, чтобы привлечь к этой rendertarget. – Jerry

ответ

2

О, я понял, что я сделал не так (вроде). Я думаю, что я использовал неправильный SurfaceFormat при создании нового экземпляра RenderTarget2D. Я использовал SurfaceFormat.Single, но я должен был использовать SurfaceFormat.Color.

Я понял это, принимая взгляд на PresentationParameters в GraphicsDevice через часы во время отладки перед установкой нового RenderTarget:

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

Смежные вопросы