2012-01-03 34 views
5

Tôi đã bắt đầu tạo trò chơi Windows dựa trên 2D sprite bằng XNA. Tôi chưa có nhiều kinh nghiệm nhưng tôi đang học. Hãy để tôi bắt đầu với nói rằng tôi đang sử dụng studio game XNA 3.1, tôi chưa cập nhật lên 4.0 (chưa).Màu sắc sai khi sử dụng RenderTarget2D trong XNA

Những gì tôi đang cố gắng hoàn thành là có thể vẽ tất cả các sprites của mình vào một bộ đệm kích thước cố định, sau đó, ở cuối của kết xuất, thu nhỏ kích thước của backbuffer thực tế và sau đó rút ra . Tôi không chắc chắn bao nhiêu độ phân giải thường được hỗ trợ, nhưng nó có vẻ giống như một giải pháp thích hợp cho tôi.

Tôi đã cố gắng để đạt được điều này bằng cách sử dụng một đối tượng RenderTarget2D để vẽ tất cả nội dung của tôi, sau đó lấy Texture2D từ đó và vẽ nó vào bộ đệm sau.

Mã của tôi trông như thế này:

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

Vấn đề tôi gặp phải là các màu sắc đều sai. Dưới đây là hình ảnh hiển thị hai ảnh chụp màn hình: ảnh đầu tiên là ảnh chụp màn hình của nó (tôi đã viết thuật toán chia tỷ lệ của chính tôi trước đó đơn giản là thu nhỏ từng chữ sprite) và bên phải nó trông như thế nào khi sử dụng RenderTarget2D.

Example of what's wrong

Có ai biết tôi đang làm gì sai không?

+1

Thật rắc rối ... hãy thử lưu Texture2D của biểu đồ rendert vào một tệp (Texture2D chứa các phương thức để lưu) và xem liệu nó có còn màu xanh để xác định xem có vấn đề hay không khi bạn vẽ trò chơi của mình đến mục tiêu hoặc vẽ mục tiêu trên màn hình (ví dụ: nếu hình ảnh đã lưu có vẻ ổn, vấn đề sẽ được vẽ lên màn hình). –

+0

Xin chào, tôi đã làm những gì bạn nói và texture2D của rendertarget trông giống hệt như trong ảnh chụp màn hình có màu sai. Vì vậy, rõ ràng vấn đề nằm trong bản vẽ cho mục tiêu này. – Jerry

Trả lời

2

Ồ tôi đã tìm ra những gì tôi đã làm sai (loại). Tôi nghĩ rằng tôi đã sử dụng SurfaceFormat sai khi tạo cá thể RenderTarget2D mới. Tôi đã sử dụng SurfaceFormat.Single nhưng tôi nên đã sử dụng SurfaceFormat.Color.

tôi figured này ra bằng cách lấy một cái nhìn tại các PresentationParameters của GraphicsDevice qua một hồ khi gỡ lỗi trước khi thiết lập RenderTarget mới:

GraphicsDevice.PresentationParameters.BackBufferFormat 

này nói với tôi nó đã được thiết lập để SurfaceFormat.Color. Vì vậy, tôi thay thế SurfaceFormat.Single với SurfaceFormat.Color và bây giờ nó hoạt động như nó cần.

+0

Đối với người đọc trong tương lai: nó là khá rõ ràng những gì đã đi sai khi bạn đọc này: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.surfaceformat.aspx SurfaceFormat.Color là một đơn giản Không gian màu RGBA 32 bit trong khi SurfaceFormat.Single là một định dạng nổi 32 bit với 32 bit cho kênh màu đỏ. – Jerry

+0

Tôi đoán nói chung tốt nhất là sử dụng [constructor RenderTarget2D] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.rendertarget2d.rendertarget2d.aspx) mà không chỉ định rõ ràng bản trình bày thông số. – user1306322

Các vấn đề liên quan