Visualizzazione dei risultati da 1 a 10 su 10

Visualizzazione discussione

  1. #1
    Utente di HTML.it L'avatar di escocat
    Registrato dal
    Feb 2012
    Messaggi
    308

    [C# / Xna] "Fotografare" lo schermo

    Ho deciso di mandare qualche "foto" agli amici di quel che vedo quando navigo nel mio sistema solare. E' la prima volta che affronto questo aspetto di Xna e mi ricordo che questa operazione si chiama "reindirizzamento del Render Target". Ho studiato un pò e come al solito "rubo" il codice che trovo nei tutorials.
    Mi serve un nuovo RenderTarget per cambiare la destinazione dell'output e una Texture2D che salvi quello che prima andava disegnato sullo schermo: fatto.
    Creo un'immagine bitmap vuota (la shadowMap) delle dimensioni del mio schermoe la metto nel Content.
    Creo il nuovo renderTarget con un costruttore che ancora devo studiare bene nei suoi parametri, ma prima di capirlo a fondo voglio vedere cosa succede. Comunque mi sembra intuitivo.
    Infine, all'inizio del Draw(), primissima cosa, reindirizzo tutto sul nuovo RenderTarget, e alla fine, ultimissima cosa, annullo questo reindirizzamento (???) e "copio" sulla shadowMap.

    codice:
    namespace Progetto_Albireo   
    {
        public class My : Microsoft.Xna.Framework.Game
        {
            //Generals          
            public static GraphicsDeviceManager Graphicsdevicemanager;
            RenderTarget2D renderTarget;
            Texture2D shadowMap;
    
            .......... 
     
            public My()
            {
                Graphicsdevicemanager = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }
    
            protected override void Initialize()
            {
                .......... 
            }
            protected override void LoadContent()
            {
                ..........             
                shadowMap = Content.Load<Texture2D>("shadow");
                
                PresentationParameters pp = GraphicsDevice.PresentationParameters;
                renderTarget = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight,
                    true, GraphicsDevice.DisplayMode.Format, DepthFormat.Depth24);
           }
            protected override void Update(GameTime gametime)
            {
                ..........
            }
            protected override void Draw(GameTime gametime)
            {
                GraphicsDevice.SetRenderTarget(renderTarget); 
               ..........
                 
                GraphicsDevice.SetRenderTarget(null);
                shadowMap = (Texture2D)renderTarget;
           }
        }
    }
    Eseguo il programma e non si vede un tubo. Giusto! Tutte le "viste" della camera della mia astronave stanno andando sulla shadowMap. Termino il programma e clicco sulla shadowMap nel Content, sicuro di vedere una "foto".... è completamente bianca.
    Mi sembrava troppo facile....
    Boh vabbè devo salvare la renderMap in qualche posto. Studio il Framework di Xna e l'unico metodo che salva una Texture2D usa un MemoryStream.... mmmmmm.... OK diamogli un MemoryStream

    codice:
    namespace Progetto_Albireo   
    {
        public class My : Microsoft.Xna.Framework.Game
        {
            //Generals          
            public static GraphicsDeviceManager Graphicsdevicemanager;
            RenderTarget2D renderTarget;
            Texture2D shadowMap;
            MemoryStream stream = new MemoryStream();
       ..........
    A questo punto cominciano le risate. Salvo la shadowMap nel MemoryStream, gli dò una dimensione di prova 500x500 ma come scrivo lo stream su un file? Un MemoryStream non ha un metodo di salvataggio, ma mi ricordo che un oggetto Bitmap ce l'ha. Ma come legare una bitmap ad un MemoryStream? Facile, c'è un costruttore Bitmap apposta. Non rimane che salvare la bitmap dove voglio:

    codice:
            ..........
             
            protected override void Draw(GameTime gametime)
            {
                GraphicsDevice.SetRenderTarget(renderTarget); 
                .......... 
                 
                GraphicsDevice.SetRenderTarget(null);
                shadowMap = (Texture2D)renderTarget;
                
                shadowMap.SaveAsJpeg(stream, 500, 500); 
              System.Drawing.Bitmap b = new System.Drawing.Bitmap(stream);
              b.Save(@"C:\prova.bmp");
       }
    
        }
    }
    Eseguo il programma, termino, guardo il file prova.bmp e .... FUNZIONA!
    Però mi sembra di aver fatto un giro troppo incasinato, c'è qualche riga di troppo? C'è un metodo più "diretto" ed "elegante"? E perchè quella riga
    GraphicsDevice.SetRenderTarget(null);

    Infine, che notizie avete sul futuro di Xna? Posso continuare a studiarlo o perdo tempo?
    Ultima modifica di escocat; 05-11-2013 a 10:59

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.