instanced directional shadows
parent
4b7d31f2b2
commit
14e07c7476
61
Renderer.cs
61
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<T, V>(
|
||||
GraphicsDevice graphicsDevice,
|
||||
PerspectiveCamera camera,
|
||||
BoundingFrustum boundingFrustum,
|
||||
T drawable,
|
||||
IEnumerable<Matrix> 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<T>(
|
||||
private void RenderDirectionalShadowMapIndexed<T>(
|
||||
DirectionalShadowMapData shadowMapData,
|
||||
int shadowCascadeIndex,
|
||||
IEnumerable<(T, Matrix)> drawableTransforms
|
||||
|
@ -706,6 +704,55 @@ namespace Kav
|
|||
);
|
||||
}
|
||||
|
||||
public void RenderDirectionalShadowsInstanced<T>(
|
||||
DirectionalShadowMapData shadowMapData,
|
||||
T drawable,
|
||||
IEnumerable<Matrix> 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<T>(
|
||||
DirectionalShadowMapData shadowMapData,
|
||||
int shadowCascadeIndex,
|
||||
T drawable,
|
||||
IEnumerable<Matrix> 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<T>(
|
||||
RenderTargetCube pointShadowCubeMap,
|
||||
PerspectiveCamera camera,
|
||||
|
|
Loading…
Reference in New Issue