locked
Luz antorcha XNA 3.0 RRS feed

  • Pregunta

  • Buenas tardes gente del foro.

    Bueno me dirijo a ustedes a como el titulo lo pone, estoy tratando de realizar un efecto de luz tipo antorcha, me estoy basando en este ejemplo: http://www.youtube.com/watch?feature=player_embedded&v=J1xr9kbQXKI
    Donde se puede descargar el código fuente, pero el problema es que esta en la versión 4.0 del framework, he logrado   casi convertirlo a 3.0 pero me tope con esta parte donde ya no supe que hacer:

    private void drawFilter(GameTime gameTime)
            {
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
                lightingEffect.Parameters["lightMask"].SetValue(lightMask); <-------- 1er error
                lightingEffect.CommitChanges();
                lightingEffect.Begin(SaveStateMode.SaveState);
                lightingEffect.CurrentTechnique.Passes[0].Begin();
                spriteBatch.Draw(mainScene, new Vector2(0, 0), Color.White); <------- 2do error
                lightingEffect.CurrentTechnique.Passes[0].End();
                lightingEffect.End();
                spriteBatch.End();
            }

    Donde el problema me lo marca en esas 2 líneas me imagino que es por la versión. Intente corregirlo pero no tuve éxito, si alguien me pudiera ayudar se lo agradecería :)
    Les dejo el código fuente y el shader por si algo debiese ser cambiado, de antemano muchas gracias :)

    Game1.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.GamerServices;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Media;
    using Microsoft.Xna.Framework.Net;
    using Microsoft.Xna.Framework.Storage;

    namespace Luces_antorchas
    {
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
            Texture2D background;
            Texture2D blackSquare;
            Texture2D ground;
            Texture2D torch;
            Texture2D lightmask;
            RenderTarget2D mainScene;
            RenderTarget2D lightMask;
            ResolveTexture2D mainScene2;
            ResolveTexture2D lightMask2;
            Effect lightingEffect;
            List<Vector2> torchPositions;
            Vector2 mousePosition = Vector2.Zero;
            const int LIGHTOFFSET = 115;

            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                Content.RootDirectory = "Content";
            }

            protected override void Initialize()
            {
                // TODO: Add your initialization logic here
                //GraphicsDevice.SamplerStates[1] = SamplerState.LinearClamp;
                torchPositions = new List<Vector2>();
                torchPositions.Add(new Vector2(40, 420));
                torchPositions.Add(new Vector2(340, 420));
                torchPositions.Add(new Vector2(640, 420));
                base.Initialize();
            }

            protected override void LoadContent()
            {
                // Create a new SpriteBatch, which can be used to draw textures.
                spriteBatch = new SpriteBatch(GraphicsDevice);
                background = Content.Load<Texture2D>("images\\bg5");
                blackSquare = Content.Load<Texture2D>("images\\blacksquare");
                ground = Content.Load<Texture2D>("images\\ground");
                torch = Content.Load<Texture2D>("images\\torch");
                lightmask = Content.Load<Texture2D>("images\\lightmask");
                lightingEffect = Content.Load<Effect>("effects\\lighting");
                var pp = GraphicsDevice.PresentationParameters;
                mainScene = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat);
                lightMask = new RenderTarget2D(GraphicsDevice, pp.BackBufferWidth, pp.BackBufferHeight, 1, pp.BackBufferFormat);
            }

            protected override void Update(GameTime gameTime)
            {
                // Allows the game to exit
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                    this.Exit();
                var mouse = Mouse.GetState();
                mousePosition = new Vector2(mouse.X, mouse.Y);
                base.Update(gameTime);
            }

            private void drawMain(GameTime gameTime)
            {
                GraphicsDevice.SetRenderTarget(0,mainScene);
                // Draws a background image.
                spriteBatch.Begin();
                spriteBatch.Draw(background, new Vector2(-300, -200), Color.White);
                // Lays out some torches based on torch positions and mouse
                foreach (var position in torchPositions)
                {
                    spriteBatch.Draw(torch, position, Color.White);
                }
                spriteBatch.Draw(torch, mousePosition, Color.White);
                // Lay out some ground.
                for (var idx = 0; idx < 25; idx++)
                {
                    spriteBatch.Draw(ground, new Vector2(32 * idx, 450), Color.White);
                }
                spriteBatch.End();
                GraphicsDevice.SetRenderTarget(0,null);
            }

            private void drawLightMask(GameTime gameTime)
            {
                GraphicsDevice.SetRenderTarget(0,lightMask);
                // Create a Black Background
                spriteBatch.Begin();
                spriteBatch.Draw(blackSquare, new Vector2(0, 0), new Rectangle(0, 0, 800, 800), Color.White);
                spriteBatch.End();
                spriteBatch.Begin(SpriteBlendMode.Additive, SpriteSortMode.Immediate, SaveStateMode.SaveState);
                // Draw out lightmasks based on torch positions.
                foreach (var position in torchPositions)
                {
                    var new_pos = new Vector2(position.X - LIGHTOFFSET, position.Y - LIGHTOFFSET);
                    spriteBatch.Draw(lightmask, new_pos, Color.White);
                }
                spriteBatch.Draw(lightmask, new Vector2(mousePosition.X - LIGHTOFFSET, mousePosition.Y - LIGHTOFFSET), Color.White);
                spriteBatch.End();
                GraphicsDevice.SetRenderTarget(0,null);
            }

            private void drawFilter(GameTime gameTime)
            {
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);
                lightingEffect.Parameters["lightMask"].SetValue(lightMask);
                lightingEffect.CommitChanges();
                lightingEffect.Begin(SaveStateMode.SaveState);
                lightingEffect.CurrentTechnique.Passes[0].Begin();
                spriteBatch.Draw(mainScene, new Vector2(0, 0), Color.White);
                lightingEffect.CurrentTechnique.Passes[0].End();
                lightingEffect.End();
                spriteBatch.End();
            }

            protected override void Draw(GameTime gameTime)
            {
                //Dibuja draMain
                drawMain(gameTime);
                //Dibuja drawLightMask
                drawLightMask(gameTime);
                //Filtro
                drawFilter(gameTime);
                base.Draw(gameTime);
            }
        }
    }


    lighting.fx

    texture lightMask;
    sampler mainSampler : register(s0);
    sampler lightSampler = sampler_state{Texture = <lightMask>;};

    struct PixelShaderInput
    {
        float4 TextureCoords: TEXCOORD0;
    };

    float4 PixelShaderFunction(PixelShaderInput input) : COLOR0
    {
    float2 texCoord = input.TextureCoords;

    float4 mainColor = tex2D(mainSampler, texCoord);
    float4 lightColor = tex2D(lightSampler, texCoord);

        return mainColor * lightColor;
    }

    technique Technique1
    {
        pass Pass1
        {
            PixelShader = compile ps_2_0 PixelShaderFunction();
        }
    }

    viernes, 5 de abril de 2013 19:16