start removing global render procedures
parent
ee8b0c5ee8
commit
8b43e8f45e
184
Renderer.cs
184
Renderer.cs
|
@ -33,14 +33,8 @@ namespace Kav
|
|||
private SkyboxEffect SkyboxEffect { get; }
|
||||
private DiffuseLitSpriteEffect DiffuseLitSpriteEffect { get; }
|
||||
|
||||
private RenderTarget2D GPosition { get; }
|
||||
private RenderTarget2D GNormal { get; }
|
||||
private RenderTarget2D GAlbedo { get; }
|
||||
private RenderTarget2D GMetallicRoughness { get; }
|
||||
private RenderTargetCube PointShadowCubeMap { get; }
|
||||
|
||||
private RenderTargetBinding[] GBuffer { get; }
|
||||
|
||||
private Kav.Model UnitCube { get; }
|
||||
|
||||
private SpriteBatch SpriteBatch { get; }
|
||||
|
@ -85,49 +79,6 @@ namespace Kav
|
|||
RenderTargetUsage.PreserveContents
|
||||
);
|
||||
|
||||
GPosition = new RenderTarget2D(
|
||||
GraphicsDevice,
|
||||
renderDimensionsX,
|
||||
renderDimensionsY,
|
||||
false,
|
||||
SurfaceFormat.Vector4,
|
||||
DepthFormat.Depth24
|
||||
);
|
||||
|
||||
GNormal = new RenderTarget2D(
|
||||
GraphicsDevice,
|
||||
renderDimensionsX,
|
||||
renderDimensionsY,
|
||||
false,
|
||||
SurfaceFormat.Vector4,
|
||||
DepthFormat.None
|
||||
);
|
||||
|
||||
GAlbedo = new RenderTarget2D(
|
||||
GraphicsDevice,
|
||||
renderDimensionsX,
|
||||
renderDimensionsY,
|
||||
false,
|
||||
SurfaceFormat.Color,
|
||||
DepthFormat.None
|
||||
);
|
||||
|
||||
GMetallicRoughness = new RenderTarget2D(
|
||||
GraphicsDevice,
|
||||
renderDimensionsX,
|
||||
renderDimensionsY,
|
||||
false,
|
||||
SurfaceFormat.HalfVector2,
|
||||
DepthFormat.None
|
||||
);
|
||||
|
||||
GBuffer = new RenderTargetBinding[4] {
|
||||
new RenderTargetBinding(GPosition),
|
||||
new RenderTargetBinding(GNormal),
|
||||
new RenderTargetBinding(GAlbedo),
|
||||
new RenderTargetBinding(GMetallicRoughness)
|
||||
};
|
||||
|
||||
PointShadowCubeMap = new RenderTargetCube(
|
||||
GraphicsDevice,
|
||||
shadowMapSize,
|
||||
|
@ -172,126 +123,6 @@ namespace Kav
|
|||
);
|
||||
}
|
||||
|
||||
public void DeferredRender(
|
||||
RenderTarget2D renderTarget,
|
||||
PerspectiveCamera camera,
|
||||
IEnumerable<(Model, Matrix)> modelTransforms,
|
||||
AmbientLight ambientLight,
|
||||
IEnumerable<PointLight> pointLights,
|
||||
DirectionalLight? directionalLight
|
||||
) {
|
||||
GBufferRender(GBuffer, camera, modelTransforms);
|
||||
|
||||
GraphicsDevice.SetRenderTarget(ColorRenderTarget);
|
||||
GraphicsDevice.Clear(Color.Black);
|
||||
|
||||
AmbientLightRender(
|
||||
ColorRenderTarget,
|
||||
GPosition,
|
||||
GAlbedo,
|
||||
ambientLight
|
||||
);
|
||||
|
||||
DeferredPointLightEffect.EyePosition = camera.Position;
|
||||
|
||||
foreach (var pointLight in pointLights)
|
||||
{
|
||||
PointLightRender(
|
||||
ColorRenderTarget,
|
||||
GPosition,
|
||||
GAlbedo,
|
||||
GNormal,
|
||||
GMetallicRoughness,
|
||||
camera,
|
||||
modelTransforms,
|
||||
pointLight
|
||||
);
|
||||
}
|
||||
|
||||
if (directionalLight.HasValue)
|
||||
{
|
||||
DirectionalLightRender(
|
||||
ColorRenderTarget,
|
||||
GPosition,
|
||||
GAlbedo,
|
||||
GNormal,
|
||||
GMetallicRoughness,
|
||||
camera,
|
||||
modelTransforms,
|
||||
directionalLight.Value,
|
||||
NumShadowCascades
|
||||
);
|
||||
}
|
||||
|
||||
GraphicsDevice.SetRenderTarget(renderTarget);
|
||||
SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque, null, null, null, ToneMapEffect);
|
||||
SpriteBatch.Draw(ColorRenderTarget, Vector2.Zero, Color.White);
|
||||
SpriteBatch.End();
|
||||
}
|
||||
|
||||
public void DeferredToonRender(
|
||||
RenderTarget2D renderTarget,
|
||||
PerspectiveCamera camera,
|
||||
IEnumerable<(Model, Matrix)> modelTransforms,
|
||||
AmbientLight ambientLight,
|
||||
IEnumerable<PointLight> pointLights,
|
||||
DirectionalLight? directionalLight,
|
||||
TextureCube skybox
|
||||
) {
|
||||
GBufferRender(GBuffer, camera, modelTransforms);
|
||||
|
||||
GraphicsDevice.SetRenderTarget(ColorRenderTarget);
|
||||
GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1f, 0);
|
||||
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
|
||||
|
||||
DepthRender(camera, modelTransforms);
|
||||
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
|
||||
|
||||
AmbientLightRender(
|
||||
ColorRenderTarget,
|
||||
GPosition,
|
||||
GAlbedo,
|
||||
ambientLight
|
||||
);
|
||||
|
||||
foreach (var pointLight in pointLights)
|
||||
{
|
||||
PointLightRender(
|
||||
ColorRenderTarget,
|
||||
GPosition,
|
||||
GAlbedo,
|
||||
GNormal,
|
||||
GMetallicRoughness,
|
||||
camera,
|
||||
modelTransforms,
|
||||
pointLight
|
||||
);
|
||||
}
|
||||
|
||||
if (directionalLight.HasValue)
|
||||
{
|
||||
DirectionalLightToonRender(
|
||||
ColorRenderTarget,
|
||||
GPosition,
|
||||
GAlbedo,
|
||||
GNormal,
|
||||
GMetallicRoughness,
|
||||
camera,
|
||||
modelTransforms,
|
||||
directionalLight.Value,
|
||||
NumShadowCascades,
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
SkyboxRender(ColorRenderTarget, camera, skybox);
|
||||
|
||||
GraphicsDevice.SetRenderTarget(renderTarget);
|
||||
SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.Opaque, null, null, null, null);
|
||||
SpriteBatch.Draw(ColorRenderTarget, Vector2.Zero, Color.White);
|
||||
SpriteBatch.End();
|
||||
}
|
||||
|
||||
// TODO: we could make this a lot more efficient probably
|
||||
// draws mesh sprites with a forward rendered diffuse lighting technique
|
||||
public void MeshSpriteRender(
|
||||
|
@ -307,7 +138,7 @@ namespace Kav
|
|||
GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.Black, 1f, 0);
|
||||
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
|
||||
|
||||
DepthRender(camera, modelTransforms);
|
||||
DepthRender(ColorRenderTarget, camera, modelTransforms);
|
||||
GraphicsDevice.Clear(ClearOptions.Target, new Color(0, 0, 0, 0), 1f, 0);
|
||||
|
||||
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
|
||||
|
@ -401,10 +232,14 @@ namespace Kav
|
|||
SpriteBatch.End();
|
||||
}
|
||||
|
||||
private void DepthRender(
|
||||
public void DepthRender(
|
||||
RenderTarget2D renderTarget,
|
||||
PerspectiveCamera camera,
|
||||
IEnumerable<(Model, Matrix)> modelTransforms
|
||||
) {
|
||||
GraphicsDevice.SetRenderTarget(renderTarget);
|
||||
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
|
||||
|
||||
var boundingFrustum = new BoundingFrustum(camera.View * camera.Projection);
|
||||
|
||||
foreach (var (model, transform) in FrustumCull(boundingFrustum, modelTransforms))
|
||||
|
@ -438,7 +273,7 @@ namespace Kav
|
|||
}
|
||||
}
|
||||
|
||||
private void SkyboxRender(
|
||||
public void SkyboxRender(
|
||||
RenderTarget2D renderTarget,
|
||||
PerspectiveCamera camera,
|
||||
TextureCube skybox
|
||||
|
@ -586,6 +421,7 @@ namespace Kav
|
|||
) {
|
||||
GraphicsDevice.SetRenderTarget(renderTarget);
|
||||
GraphicsDevice.BlendState = BlendState.Opaque;
|
||||
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
|
||||
|
||||
DeferredAmbientLightEffect.GPosition = gPosition;
|
||||
DeferredAmbientLightEffect.GAlbedo = gAlbedo;
|
||||
|
@ -621,6 +457,8 @@ namespace Kav
|
|||
DeferredPointLightEffect.GMetallicRoughness = gMetallicRoughness;
|
||||
DeferredPointLightEffect.ShadowMap = PointShadowCubeMap;
|
||||
|
||||
DeferredPointLightEffect.EyePosition = camera.Position;
|
||||
|
||||
DeferredPointLightEffect.PointLightPosition = pointLight.Position;
|
||||
DeferredPointLightEffect.PointLightColor =
|
||||
pointLight.Color.ToVector3() * pointLight.Intensity;
|
||||
|
@ -686,7 +524,7 @@ namespace Kav
|
|||
}
|
||||
}
|
||||
|
||||
private void DirectionalLightToonRender(
|
||||
public void DirectionalLightToonRender(
|
||||
RenderTarget2D renderTarget,
|
||||
Texture2D gPosition,
|
||||
Texture2D gAlbedo,
|
||||
|
|
Loading…
Reference in New Issue