diff --git a/Renderer.cs b/Renderer.cs index 2cc799f..5eabb74 100644 --- a/Renderer.cs +++ b/Renderer.cs @@ -31,7 +31,7 @@ namespace Kav private Kav.Model UnitCube { get; } private DynamicVertexBuffer PositionInstanceVertexBuffer { get; } - private readonly PositionInstanceVertex[] GBufferInstanceVertices = new PositionInstanceVertex[MAX_INSTANCE_VERTEX_COUNT]; + private readonly PositionInstanceVertex[] PositionInstanceVertices = new PositionInstanceVertex[MAX_INSTANCE_VERTEX_COUNT]; public Renderer( GraphicsDevice graphicsDevice @@ -243,15 +243,13 @@ namespace Kav public static int FillAndSetBuffersForInstancing( GraphicsDevice graphicsDevice, - PerspectiveCamera camera, + BoundingFrustum boundingFrustum, T drawable, IEnumerable transforms, V[] vertexData, DynamicVertexBuffer dynamicVertexBuffer ) where T : ICullable, IIndexDrawable where V : struct, IVertexType, IHasTranslation { - var boundingFrustum = new BoundingFrustum(camera.View * camera.Projection); - int numInstances = 0; foreach (var transform in FrustumCull(boundingFrustum, drawable, transforms)) { @@ -387,10 +385,10 @@ namespace Kav var numInstances = FillAndSetBuffersForInstancing( GraphicsDevice, - camera, + new BoundingFrustum(camera.View * camera.Projection), drawable, transforms, - GBufferInstanceVertices, + PositionInstanceVertices, PositionInstanceVertexBuffer ); @@ -686,7 +684,7 @@ namespace Kav } } - public void RenderDirectionalShadowMapIndexed( + private void RenderDirectionalShadowMapIndexed( DirectionalShadowMapData shadowMapData, int shadowCascadeIndex, IEnumerable<(T, Matrix)> drawableTransforms @@ -706,6 +704,55 @@ namespace Kav ); } + public void RenderDirectionalShadowsInstanced( + DirectionalShadowMapData shadowMapData, + T drawable, + IEnumerable transforms + ) where T : ICullable, IIndexDrawable + { + // render the individual shadow cascades + for (var i = 0; i < shadowMapData.NumShadowCascades; i++) + { + RenderDirectionalShadowMapInstanced( + shadowMapData, + i, + drawable, + transforms + ); + } + } + + private void RenderDirectionalShadowMapInstanced( + DirectionalShadowMapData shadowMapData, + int shadowCascadeIndex, + T drawable, + IEnumerable transforms + ) where T : ICullable, IIndexDrawable + { + GraphicsDevice.SetRenderTarget(shadowMapData.ShadowMaps[shadowCascadeIndex]); + GraphicsDevice.DepthStencilState = DepthStencilState.Default; + GraphicsDevice.BlendState = BlendState.Opaque; + + SimpleDepthEffectInstanced.View = shadowMapData.LightSpaceViews[shadowCascadeIndex]; + SimpleDepthEffectInstanced.Projection = shadowMapData.LightSpaceProjections[shadowCascadeIndex]; + + var numInstances = FillAndSetBuffersForInstancing( + GraphicsDevice, + new BoundingFrustum(SimpleDepthEffectInstanced.View * SimpleDepthEffectInstanced.Projection), + drawable, + transforms, + PositionInstanceVertices, + PositionInstanceVertexBuffer + ); + + RenderInstanced( + GraphicsDevice, + drawable, + SimpleDepthEffectInstanced, + numInstances + ); + } + public void RenderPointShadowMapIndexed( RenderTargetCube pointShadowCubeMap, PerspectiveCamera camera,