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); }
public override void Initialize() { mCamera = new Camera(mGame, true); Game.Components.Add(mCamera); base.Initialize(); }
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; }
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); }