コード例 #1
0
ファイル: Game1.cs プロジェクト: bschwind/Shading
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            cam = new Camera(2.5f, 0.01f, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);

            cathedral = Content.Load<Model>("Models/dragon");

            renderer = new Renderer(Content, GraphicsDevice, spriteBatch);
            renderer.AddModel(cathedral);
            gaussian = new GaussianBlurPP(renderer.PostProcessor, sigma);
            renderer.PostProcessor.AddPPEffect(gaussian);
        }
コード例 #2
0
ファイル: Renderer.cs プロジェクト: bschwind/Shading
        public void Render(GameTime g, Camera cam)
        {
            float dt = (float)g.ElapsedGameTime.TotalSeconds;
            float elapsed = (float)g.TotalGameTime.TotalSeconds;

            device.SetRenderTargets(colorTarget, normalTarget, depthTarget);
            clearGBufferEffect.Parameters["farplane"].SetValue(cam.FarPlane);
            postProcessor.DrawFullScreenQuad(clearGBufferEffect);

            device.BlendState = BlendState.Opaque;
            device.DepthStencilState = DepthStencilState.Default;

            BoundingFrustum frustum = new BoundingFrustum(cam.View * cam.Projection);
            //renderGBufferEffect.Parameters["frustumCorners"].SetValue(frustum.GetCorners());

            foreach (Model m in models)
            {
                foreach (ModelMesh mesh in m.Meshes)
                {
                    foreach (ModelMeshPart meshPart in mesh.MeshParts)
                    {
                        Effect effect = meshPart.Effect;

                        effect.Parameters["World"].SetValue(Matrix.Identity);
                        effect.Parameters["View"].SetValue(cam.View);
                        effect.Parameters["Projection"].SetValue(cam.Projection);
                    }

                    mesh.Draw();
                }
            }

            //Texture2D result = postProcessor.Process(normalTarget, colorTarget, depthTarget, normalTarget);

            device.SetRenderTarget(colorTarget);
            device.Clear(Color.Red);

            //PostProcessor.DrawFullScreenQuad(depthTarget);
            Vector3[] corners = frustum.GetCorners();
            Vector3[] farCorners = new Vector3[4];
            for (int i = 0; i < corners.Length; i++)
            {
                corners[i] = Vector3.Transform(corners[i], cam.View);
            }

            for (int i = 0; i < 4; i++)
            {
                farCorners[i] = corners[i + 4] - corners[i];
            }

            ssaoEffect.Parameters["frustumCorners"].SetValue(farCorners);
            ssaoEffect.Parameters["depthMap"].SetValue(depthTarget);
            ssaoEffect.Parameters["normalMap"].SetValue(normalTarget);
            ssaoEffect.Parameters["noiseMap"].SetValue(NoiseMap);
            ssaoEffect.Parameters["halfPixel"].SetValue(new Vector2(0.5f / (float)device.PresentationParameters.BackBufferWidth,
                                                        0.5f / (float)device.PresentationParameters.BackBufferHeight));
            ssaoEffect.Parameters["Projection"].SetValue(cam.Projection);
            ssaoEffect.Parameters["invProjection"].SetValue(Matrix.Invert(cam.Projection));
            Matrix tempView = cam.View;
            tempView.M41 = 0;
            tempView.M42 = 0;
            tempView.M43 = 0;
            tempView.M44 = 0;
            ssaoEffect.Parameters["View"].SetValue(tempView);
            ssaoEffect.Parameters["radius"].SetValue(radius);

            PostProcessor.DrawFullScreenQuad(ssaoEffect);

            Texture2D result = postProcessor.Process(colorTarget, colorTarget, depthTarget, normalTarget);

            device.SetRenderTarget(null);
            device.Clear(Color.Red);
            postProcessor.DrawFullScreenQuad(result);
        }