2012-01-03 2 views
5

XNA를 사용하여 2D 스프라이트 기반 Windows 게임을 만들기 시작했습니다. 나는 아직 경험이 많지 않지만 배우고 있습니다. XNA 게임 스튜디오 3.1을 사용 중이며 아직 4.0으로 업데이트하지 않았다는 말로 시작하겠습니다.XNA에서 RenderTarget2D를 사용할 때 색이 잘못되었습니다.

내가 달성하고자하는 것은 고정 된 크기의 버퍼에 모든 스프라이트를 그릴 수있게하는 것입니다. 그러면 고정 된 크기의 버퍼가 렌더링 패스의 끝에서 실제 백 버퍼의 크기로 조정 된 다음 . 여러 해상도가 일반적으로 어떻게 지원되는지 잘 모르겠지만, 나에게는 적절한 해결책 인 것 같았습니다.

나는 RenderTarget2D 객체를 사용하여 모든 것을 채운 다음 Texture2D를 가져 와서 backbuffer에 그려 넣습니다.

내 코드는 다음과 같습니다 : I 발생할

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

그게 당혹 스럽네요. 렌더링 타겟의 Texture2D를 파일로 저장하고 (Texture2D에 저장하는 방법 포함), 아직 파란색인지 확인하여 대상을 게임에 그릴 때의 문제인지 여부를 확인하십시오 또는 화면에 대상을 그립니다 (즉, 저장된 이미지가 잘 보이는 경우 문제가 화면에 나타납니다). –

+0

안녕하세요, 저는 당신이 말한 것을했는데 렌더링 타겟의 texture2D는 스크린 샷에서 잘못된 색상으로 보이는 것처럼 정확하게 보입니다. 그래서 명백하게 문제는이 렌더링 타겟에 드로잉하는 것입니다. – Jerry

답변

2

오, 내가 뭘 잘못했는지 알아 냈어. 새로운 RenderTarget2D 인스턴스를 만들 때 잘못된 SurfaceFormat을 사용했다고 생각합니다. SurfaceFormat.Single을 사용했지만 SurfaceFormat.Color를 사용해야했습니다.

GraphicsDevice.PresentationParameters.BackBufferFormat 

이 그것을 SurfaceFormat.Color로 설정 나에게 말했다 : 새로운 렌더 타겟을 설정하기 전에 디버깅하는 동안

은 내가 시계 통해 GraphicsDevice에의 PresentationParameters 한 번 봐 복용하여 알아 냈어. 그래서 SurfaceFormat.Color로 SurfaceFormat.Single을 대체했습니다. 이제는 정상적으로 작동합니다.

+0

향후 독자를 위해 :이 문서를 읽을 때 무엇이 ​​잘못되었는지는 분명합니다. http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.surfaceformat.aspx SurfaceFormat.Color는 간단합니다. 32 비트 RGBA 색 공간, SurfaceFormat.Single은 32 비트 float 형식이며, 빨간색 채널은 32 비트입니다. – Jerry

+0

일반적으로 프레젠테이션을 명시 적으로 지정하지 않고 [RenderTarget2D 생성자] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.rendertarget2d.rendertarget2d.aspx)를 사용하는 것이 가장 좋습니다. 매개 변수. – user1306322

관련 문제