Exemple #1
0
        public void Render(RenderTarget2D pLightRT, RenderTarget2D pAlbedoRT, RenderTarget2D pNormalRT, RenderTarget2D pDepthRT, Camera pCamera)
        {
            mGame.GraphicsDevice.SetRenderTarget(pLightRT);

            mGame.GraphicsDevice.Clear(Color.Transparent);

            mGame.GraphicsDevice.BlendState = BlendState.AlphaBlend;
            mGame.GraphicsDevice.DepthStencilState = DepthStencilState.None;

            mDirectionalLightEffect.Parameters["AlbedoMap"].SetValue(pAlbedoRT);
            mDirectionalLightEffect.Parameters["NormalMap"].SetValue(pNormalRT);
            mDirectionalLightEffect.Parameters["DepthMap"].SetValue(pDepthRT);
            mDirectionalLightEffect.Parameters["LightDirection"].SetValue(new Vector3(0.5f, -0.3f, 0.0f));
            mDirectionalLightEffect.Parameters["Color"].SetValue(new Vector3(0.9f, 0.5f, 0.3f));
            mDirectionalLightEffect.Parameters["CameraPosition"].SetValue(pCamera.Position);
            mDirectionalLightEffect.Parameters["InvertViewProjection"].SetValue(Matrix.Invert(pCamera.View * pCamera.Projection));
            mDirectionalLightEffect.Parameters["HalfPixel"].SetValue(mHalfPixel);

            mDirectionalLightEffect.Techniques[0].Passes[0].Apply();
            mQuadRenderer.Render(Vector2.One * -1, Vector2.One);

            DrawPointLight(pAlbedoRT, pNormalRT, pDepthRT, pCamera, pCamera.Position - Vector3.UnitZ * 150, Color.Blue, 100, 1);

            mGame.GraphicsDevice.BlendState = BlendState.Opaque;
            //mGame.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            mGame.GraphicsDevice.SetRenderTarget(null);
        }
Exemple #2
0
        public override void Initialize()
        {
            mCamera = new Camera(mGame, true);

            Game.Components.Add(mCamera);

            base.Initialize();
        }
Exemple #3
0
        private void DrawPointLight(RenderTarget2D pAlbedoRT, RenderTarget2D pNormalRT, RenderTarget2D pDepthRT, Camera pCamera, Vector3 pPosition, Color pColor, int pRadius, int pIntensity)
        {
            // Set-up light buffer render targets.
            mPointLightEffect.Parameters["AlbedoMap"].SetValue(pAlbedoRT);
            mPointLightEffect.Parameters["NormalMap"].SetValue(pNormalRT);
            mPointLightEffect.Parameters["DepthMap"].SetValue(pDepthRT);

            // Compute the light world matrix.
            // Scale according to the radius and translate it to light position.
            Matrix sphereToWorldMatrix = Matrix.CreateScale(pRadius) * Matrix.CreateTranslation(pPosition);

            mPointLightEffect.Parameters["World"].SetValue(sphereToWorldMatrix);
            mPointLightEffect.Parameters["View"].SetValue(pCamera.View);
            mPointLightEffect.Parameters["Projection"].SetValue(pCamera.Projection);

            mPointLightEffect.Parameters["LightPosition"].SetValue(pPosition);

            mPointLightEffect.Parameters["Color"].SetValue(pColor.ToVector3());
            mPointLightEffect.Parameters["LightIntensity"].SetValue(pIntensity);
            mPointLightEffect.Parameters["LightRadius"].SetValue(pRadius);

            // Parameters for specular computations.
            mPointLightEffect.Parameters["CameraPosition"].SetValue(pCamera.Position);
            mPointLightEffect.Parameters["InvertViewProjection"].SetValue(Matrix.Invert(pCamera.View * pCamera.Projection));

            // Size of a half pixel, for texture alignement.
            mPointLightEffect.Parameters["HalfPixel"].SetValue(mHalfPixel);

            // Calculate the distance between the camera and the light center.
            float cameraToCenter = Vector3.Distance(pCamera.Position, pPosition);

            // If we are inside the volume, draw the sphere's inside face.
            if (cameraToCenter < pRadius)
                mGame.GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;
            else
                mGame.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;

            mPointLightEffect.Techniques[0].Passes[0].Apply();

            foreach (ModelMesh mesh in mSphereModel.Meshes)
            {
                foreach (ModelMeshPart meshPart in mesh.MeshParts)
                {
                    mGame.GraphicsDevice.Indices = meshPart.IndexBuffer;
                    mGame.GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);

                    mGame.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
                }
            }

            mGame.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
        }
Exemple #4
0
        public void Render(RenderTarget2D pAlbedoRT, RenderTarget2D pNormalRT, RenderTarget2D pDepthRT, Camera pCamera)
        {
            mGame.GraphicsDevice.SetRenderTargets(pAlbedoRT, pNormalRT, pDepthRT);

            // Clear GBuffer.
            mClearBufferEffect.Techniques[0].Passes[0].Apply();
            mQuadRenderer.Render(Vector2.One * -1, Vector2.One);

            foreach (DeferredSprite sprite in Engine.Instance.CurrentScene.Sprites)
            {
                mRenderBufferEffect.Techniques[0].Passes[0].Apply();

                Texture2D diffuse;
                Texture2D normal;
                Texture2D specular;

                MaterialManager.GetTextures(sprite.MaterialId, out diffuse, out normal, out specular);

                mRenderBufferEffect.Parameters["DiffuseMap"].SetValue(diffuse);
                mRenderBufferEffect.Parameters["NormalMap"].SetValue(normal);
                mRenderBufferEffect.Parameters["SpecularMap"].SetValue(specular);

                mRenderBufferEffect.Parameters["World"].SetValue(Matrix.CreateTranslation(sprite.Position));
                mRenderBufferEffect.Parameters["View"].SetValue(pCamera.View);
                mRenderBufferEffect.Parameters["Projection"].SetValue(pCamera.Projection);

                // Set Render States.
                mGame.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
                mGame.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
                mGame.GraphicsDevice.BlendState = BlendState.Opaque;

                foreach (ModelMesh mesh in mGround.Meshes)
                {
                    foreach (ModelMeshPart meshPart in mesh.MeshParts)
                    {

                        //meshPart.VertexBuffer.VertexDeclaration
                        mGame.GraphicsDevice.Indices = meshPart.IndexBuffer;
                        mGame.GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);

                        mGame.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, meshPart.VertexOffset, 0, meshPart.NumVertices, meshPart.StartIndex, meshPart.PrimitiveCount);
                    }
                }
            }

            // Resolve Render Targets.
            mGame.GraphicsDevice.SetRenderTargets(null);
        }