Пример #1
0
        public MultiLightShader(Effect effect, CookTorranceMaterial material) : base(effect)
        {
            Vector3[] lights = new Vector3[3]
            {
                new Vector3(10f, 0f, 5f),
                new Vector3(-10f, 0f, 5f),
                new Vector3(0f, 10f, 5f)
            };

            Vector3[] lightColors = new Vector3[3]
            {
                Color.Red.ToVector3(),
                      Color.Blue.ToVector3(),
                      Color.LightPink.ToVector3()
            };

            effect.Parameters["LightDirections"].SetValue(lights);
            effect.Parameters["AmbientColor"].SetValue(material.AmbientColor.ToVector3());
            effect.Parameters["LightColors"].SetValue(lightColors);
            effect.Parameters["SpecularColor"].SetValue(material.SpecularColor.ToVector3());
            effect.Parameters["AmbientIntensity"].SetValue(material.AmbientIntensity);
            effect.Parameters["SpecularIntensity"].SetValue(material.SpecularIntensity);
            effect.Parameters["SpecularPower"].SetValue(256f);
            effect.Parameters["LightCount"].SetValue(lights.Length);
        }
Пример #2
0
 public CookTorranceShader(Effect effect, CookTorranceMaterial material) : base(effect)
 {
     effect.Parameters["LightPosition"].SetValue(new Vector3(100.0f, 100.0f, 100.0f));
     effect.Parameters["AmbientColor"].SetValue(material.AmbientColor.ToVector3());
     effect.Parameters["DiffuseColor"].SetValue(material.DiffuseColor.ToVector3());
     effect.Parameters["SpecularColor"].SetValue(material.SpecularColor.ToVector3());
     effect.Parameters["AmbientIntensity"].SetValue(material.AmbientIntensity);
     effect.Parameters["SpecularIntensity"].SetValue(material.SpecularIntensity);
     effect.Parameters["SpecularPower"].SetValue(material.SpecularPower);
     effect.Parameters["Roughness"].SetValue(material.Roughness);
     effect.Parameters["R0"].SetValue(material.ReflectanceCoefficient);
 }
Пример #3
0
        protected override void LoadContent()
        {
            // Setup graphics device
            graphicsDevice = graphicsDeviceManager.GraphicsDevice;
            graphicsDevice.RasterizerState = new RasterizerState();

            // Initialize bitmap renderer and font texture
            SpriteBatch spriteBatch = new SpriteBatch(graphicsDevice);
            SpriteFont  spriteFont  = Content.Load <SpriteFont>("fonts/arial12");

            // Initialize scenemanager
            sceneManager = new SceneManager(graphicsDevice, spriteBatch, spriteFont);

            // Load models
            Microsoft.Xna.Framework.Graphics.Model xhead = Content.Load <Microsoft.Xna.Framework.Graphics.Model>("models/head");

            Model head          = new Model(xhead);
            Model terrain       = new Model(graphicsDevice, Content.Load <Texture2D>("textures/heightmap"), Vector3.Zero, Vector3.Zero, 0.5f);
            Model teapotModel   = new Model(Content.Load <Microsoft.Xna.Framework.Graphics.Model>("models/teapot"), Vector3.Zero, Vector3.Zero, 10f);
            Model tabletopModel = new Model(Content.Load <Microsoft.Xna.Framework.Graphics.Model>("models/tabletop"), Vector3.Zero, Vector3.Zero, 20f);

            List <Model> headgerow = new List <Model>()
            {
                new Model(xhead, new Vector3(-80f + 0 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 1 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 2 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 3 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 4 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 5 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 6 * 40f, 0f, 0f)),
                new Model(xhead, new Vector3(-80f + 7 * 40f, 0f, 0f))
            };

            // Initialize materials
            LambertianMaterial lambertianMaterial = new LambertianMaterial()
            {
                AmbientColor     = Color.Red,
                AmbientIntensity = 0.2f,
                DiffuseColor     = Color.Orange
            };

            PhongMaterial phongMaterial = new PhongMaterial()
            {
                AmbientColor      = Color.Red,
                AmbientIntensity  = 0.2f,
                DiffuseColor      = Color.Orange,
                SpecularColor     = Color.White,
                SpecularIntensity = 1f,
                SpecularPower     = 32f
            };

            PhongMaterial woodMaterial = new PhongMaterial()
            {
                AmbientColor      = Color.Black,
                AmbientIntensity  = 0.2f,
                DiffuseColor      = Color.BurlyWood,
                SpecularColor     = Color.White,
                SpecularIntensity = 0.2f,
                SpecularPower     = 32f
            };

            CookTorranceMaterial cookTorranceMaterial = new CookTorranceMaterial()
            {
                AmbientColor           = Color.Gold,
                AmbientIntensity       = 0.2f,
                DiffuseColor           = Color.Goldenrod,
                SpecularColor          = Color.White,
                SpecularIntensity      = 2f,
                SpecularPower          = 25f,
                Roughness              = 0.5f,
                ReflectanceCoefficient = 1.42f
            };

            // Initialize shaders
            BasicEffect basicEffect = new BasicEffect(graphicsDevice);

            basicEffect.VertexColorEnabled             = true;
            basicEffect.LightingEnabled                = true;
            basicEffect.AmbientLightColor              = new Vector3(0.3f);
            basicEffect.DirectionalLight0.Enabled      = true;
            basicEffect.DirectionalLight0.DiffuseColor = Color.White.ToVector3();
            basicEffect.DirectionalLight0.Direction    = new Vector3(0, -1, 0);

            Shader basicShader        = new Shader(basicEffect);
            Shader woodShader         = new WoodShader(Content.Load <Effect>("shaders/wooden"), woodMaterial, sceneManager.Camera, Content.Load <Texture2D>("textures/wood"));
            Shader phongShader        = new PhongShader(Content.Load <Effect>("shaders/phong"), phongMaterial, sceneManager.Camera);
            Shader normalShader       = new Shader(Content.Load <Effect>("shaders/normals"));
            Shader checkersShader     = new Shader(Content.Load <Effect>("shaders/checkers"));
            Shader spotLightShader    = new SpotLightShader(Content.Load <Effect>("shaders/spotlight"), phongMaterial);
            Shader lambertianShader   = new LambertianShader(Content.Load <Effect>("shaders/lambertian"), lambertianMaterial);
            Shader multiLightShader   = new MultiLightShader(Content.Load <Effect>("shaders/multilight"), cookTorranceMaterial);
            Shader projectionShader   = new ProjectionShader(Content.Load <Effect>("shaders/projective-texture"), phongMaterial, Content.Load <Texture2D>("textures/smiley"));
            Shader cookTorranceShader = new CookTorranceShader(Content.Load <Effect>("shaders/cook-torrance"), cookTorranceMaterial);

            // Initialize post-processors
            Filter monochromeFilter = new Filter(graphicsDevice, spriteBatch, Content.Load <Effect>("shaders/monochrome"));
            Filter gaussianFilter   = new GaussianBlur(graphicsDevice, spriteBatch, Content.Load <Effect>("shaders/gaussian-blur"));

            // Create scenes in the scene manager
            sceneManager.AddScene(SceneID.Terrain, basicShader, terrain, null, Vector3.Transform(new Vector3(0f, 0f, 100f), Matrix.CreateRotationX(MathHelper.ToRadians(-40f))));
            sceneManager.AddScene(SceneID.Wood, woodShader, tabletopModel, null, Vector3.Transform(new Vector3(0f, 0f, 100f), Matrix.CreateRotationX(MathHelper.ToRadians(20f))));
            sceneManager.AddScene(SceneID.Lambertian, lambertianShader, teapotModel, null, Vector3.Transform(new Vector3(0f, 0f, 100f), Matrix.CreateRotationX(MathHelper.ToRadians(-20f))));
            sceneManager.AddScene(SceneID.Phong, phongShader, teapotModel, null, Vector3.Transform(new Vector3(0f, 0f, 100f), Matrix.CreateRotationX(MathHelper.ToRadians(-20f))));
            sceneManager.AddScene(SceneID.Normals, normalShader, head);
            sceneManager.AddScene(SceneID.Checkers, checkersShader, teapotModel, null, Vector3.Transform(new Vector3(0f, 0f, 100f), Matrix.CreateRotationX(MathHelper.ToRadians(-20f))));
            sceneManager.AddScene(SceneID.CookTorrance, cookTorranceShader, head);
            sceneManager.AddScene(SceneID.Spotlight, spotLightShader, head);
            sceneManager.AddScene(SceneID.Multilight, multiLightShader, head);
            sceneManager.AddScene(SceneID.Culling, normalShader, headgerow);
            sceneManager.AddScene(SceneID.Projection, projectionShader, head);
            sceneManager.AddScene(SceneID.Monochrome, cookTorranceShader, head, monochromeFilter);
            sceneManager.AddScene(SceneID.GaussianBlur, normalShader, head, gaussianFilter);
        }