From 393b8bcb03510f2cd87bdef2c6a22731334407dd Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Fri, 7 Aug 2020 01:12:46 -0700 Subject: [PATCH] supporting directional lights --- EffectInterfaces/DirectionalLightEffect.cs | 8 +++ Effects/FXB/PBREffect.fxb | Bin 38008 -> 58048 bytes Effects/HLSL/PBREffect.fx | 68 ++++++++++++------ Effects/PBREffect.cs | 76 +++++++++++++++++++-- Geometry/Model.cs | 14 ---- Kav.csproj | 3 + Lights/DirectionalLight.cs | 34 +++++++++ Lights/PointLight.cs | 8 +-- Renderer.cs | 39 ++++++++--- Resources.cs | 2 +- 10 files changed, 198 insertions(+), 54 deletions(-) create mode 100644 EffectInterfaces/DirectionalLightEffect.cs create mode 100644 Lights/DirectionalLight.cs diff --git a/EffectInterfaces/DirectionalLightEffect.cs b/EffectInterfaces/DirectionalLightEffect.cs new file mode 100644 index 0000000..53ba894 --- /dev/null +++ b/EffectInterfaces/DirectionalLightEffect.cs @@ -0,0 +1,8 @@ +namespace Kav +{ + public interface DirectionalLightEffect + { + int MaxDirectionalLights { get; } + DirectionalLightCollection DirectionalLights { get; } + } +} diff --git a/Effects/FXB/PBREffect.fxb b/Effects/FXB/PBREffect.fxb index 97637627ab81ffc08b726b0604530721a4ea9bec..1cac37bfdd0fc6b518a614ba687350f1aba72505 100644 GIT binary patch literal 58048 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 YuA3=&FyQpT*0sY=nI3(e$9)%aJTGNJD|A^ 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 Kav.Resources.PBREffect.fxb + + Kav.Resources.SimpleDepthEffect.fxb + diff --git a/Lights/DirectionalLight.cs b/Lights/DirectionalLight.cs new file mode 100644 index 0000000..31ca4fd --- /dev/null +++ b/Lights/DirectionalLight.cs @@ -0,0 +1,34 @@ +using Microsoft.Xna.Framework; + +namespace Kav +{ + public struct DirectionalLight + { + public Vector3 Direction { get; set; } + public Color Color { get; set; } + public float Intensity { get; set; } + + public Matrix View + { + get + { + return Matrix.CreateLookAt(-Direction * 100f, Vector3.Zero, Vector3.Up); + } + } + + public Matrix Projection + { + get + { + return Matrix.CreateOrthographic(20f, 20f, 1f, 101f); + } + } + + public DirectionalLight(Vector3 direction, Color color, float intensity = 1f) + { + Direction = direction; + Color = color; + Intensity = intensity; + } + } +} diff --git a/Lights/PointLight.cs b/Lights/PointLight.cs index 657f7ea..6d3fb90 100644 --- a/Lights/PointLight.cs +++ b/Lights/PointLight.cs @@ -2,11 +2,11 @@ using Microsoft.Xna.Framework; namespace Kav { - public class PointLight + public struct PointLight { - public Vector3 Position { get; set; } - public Color Color { get; set; } - public float Intensity { get; set; } + public Vector3 Position { get; } + public Color Color { get; } + public float Intensity { get; } public PointLight(Vector3 position, Color color, float intensity = 1f) { diff --git a/Renderer.cs b/Renderer.cs index 79b078d..77037b3 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -31,19 +31,23 @@ namespace Kav SimpleDepthEffect = new SimpleDepthEffect(GraphicsDevice); } - public void Render(Camera camera, IEnumerable models, IEnumerable pointLights) - { - Render(camera.View, camera.Projection, models, pointLights); + public void Render( + Camera camera, + IEnumerable<(Model, Matrix)> modelTransforms, + IEnumerable pointLights, + IEnumerable directionalLights + ) { + Render(camera.View, camera.Projection, modelTransforms, pointLights, directionalLights); } // for shadow mapping - public void DepthRender(Matrix view, Matrix projection, IEnumerable<(Model, Matrix)> modelTransforms, IEnumerable pointLights) + public void DepthRender(IEnumerable<(Model, Matrix)> modelTransforms, DirectionalLight directionalLight) { GraphicsDevice.SetRenderTarget(DepthRenderTarget); GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0); - SimpleDepthEffect.View = view; - SimpleDepthEffect.Projection = projection; + SimpleDepthEffect.View = directionalLight.View; + SimpleDepthEffect.Projection = directionalLight.Projection; foreach (var (model, transform) in modelTransforms) { @@ -74,9 +78,14 @@ namespace Kav } } - private void Render(Matrix view, Matrix projection, IEnumerable models, IEnumerable pointLights) - { - foreach (var model in models) + private void Render( + Matrix view, + Matrix projection, + IEnumerable<(Model, Matrix)> modelTransforms, + IEnumerable pointLights, + IEnumerable directionalLights + ) { + foreach (var (model, transform) in modelTransforms) { foreach (var modelMesh in model.Meshes) { @@ -87,6 +96,7 @@ namespace Kav if (meshPart.Effect is TransformEffect transformEffect) { + transformEffect.World = transform; transformEffect.View = view; transformEffect.Projection = projection; } @@ -102,6 +112,17 @@ namespace Kav } } + if (meshPart.Effect is DirectionalLightEffect directionalLightEffect) + { + int i = 0; + foreach (var directionalLight in directionalLights) + { + if (i > directionalLightEffect.MaxDirectionalLights) { break; } + directionalLightEffect.DirectionalLights[i] = directionalLight; + i++; + } + } + foreach (var pass in meshPart.Effect.CurrentTechnique.Passes) { pass.Apply(); diff --git a/Resources.cs b/Resources.cs index 4964b4a..6ff3806 100644 --- a/Resources.cs +++ b/Resources.cs @@ -22,7 +22,7 @@ namespace Kav { if (simpleDepthEffect == null) { - simpleDepthEffect = GetResource("SimpleDepthEffecT"); + simpleDepthEffect = GetResource("SimpleDepthEffect"); } return simpleDepthEffect; }