start on depth rendering
parent
2d1a50e1c4
commit
86cc23b0ad
Binary file not shown.
|
@ -0,0 +1,36 @@
|
||||||
|
#include "Macros.fxh"
|
||||||
|
|
||||||
|
BEGIN_CONSTANTS
|
||||||
|
|
||||||
|
float4x4 ModelViewProjection _vs(c0) _cb(c0);
|
||||||
|
|
||||||
|
MATRIX_CONSTANTS
|
||||||
|
|
||||||
|
END_CONSTANTS
|
||||||
|
|
||||||
|
struct VertexShaderInput
|
||||||
|
{
|
||||||
|
float4 Position : POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertexShaderOutput
|
||||||
|
{
|
||||||
|
float4 Position : SV_Position;
|
||||||
|
};
|
||||||
|
|
||||||
|
VertexShaderOutput main_vs(VertexShaderInput input)
|
||||||
|
{
|
||||||
|
VertexShaderOutput output;
|
||||||
|
|
||||||
|
output.Position = mul(float4(input.Position.xyz, 1.0), ModelViewProjection);
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
Technique SimpleDepth
|
||||||
|
{
|
||||||
|
Pass
|
||||||
|
{
|
||||||
|
VertexShader = compile vs_3_0 main_vs();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
|
namespace Kav
|
||||||
|
{
|
||||||
|
public class SimpleDepthEffect : Effect
|
||||||
|
{
|
||||||
|
EffectParameter modelViewProjectionParam;
|
||||||
|
|
||||||
|
Matrix model;
|
||||||
|
Matrix view;
|
||||||
|
Matrix projection;
|
||||||
|
|
||||||
|
EffectDirtyFlags dirtyFlags = EffectDirtyFlags.All;
|
||||||
|
|
||||||
|
public Matrix Model
|
||||||
|
{
|
||||||
|
get { return model; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
model = value;
|
||||||
|
dirtyFlags |= EffectDirtyFlags.WorldViewProj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Matrix View
|
||||||
|
{
|
||||||
|
get { return view; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
view = value;
|
||||||
|
dirtyFlags |= EffectDirtyFlags.WorldViewProj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Matrix Projection
|
||||||
|
{
|
||||||
|
get { return projection; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
projection = value;
|
||||||
|
dirtyFlags |= EffectDirtyFlags.WorldViewProj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public SimpleDepthEffect(GraphicsDevice graphicsDevice) : base(graphicsDevice, Resources.SimpleDepthEffect)
|
||||||
|
{
|
||||||
|
CacheEffectParameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnApply()
|
||||||
|
{
|
||||||
|
if ((dirtyFlags & EffectDirtyFlags.WorldViewProj) != 0)
|
||||||
|
{
|
||||||
|
Matrix.Multiply(ref model, ref view, out Matrix modelView);
|
||||||
|
Matrix.Multiply(ref modelView, ref projection, out Matrix worldViewProj);
|
||||||
|
|
||||||
|
modelViewProjectionParam.SetValue(worldViewProj);
|
||||||
|
|
||||||
|
dirtyFlags &= ~EffectDirtyFlags.WorldViewProj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CacheEffectParameters()
|
||||||
|
{
|
||||||
|
modelViewProjectionParam = Parameters["ModelViewProjection"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
82
Renderer.cs
82
Renderer.cs
|
@ -1,23 +1,89 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
|
||||||
namespace Kav
|
namespace Kav
|
||||||
{
|
{
|
||||||
public static class Renderer
|
public class Renderer
|
||||||
{
|
{
|
||||||
public static void Render(GraphicsDevice graphicsDevice, Camera camera, IEnumerable<Model> models, IEnumerable<PointLight> pointLights)
|
private GraphicsDevice GraphicsDevice { get; }
|
||||||
{
|
private int RenderDimensionsX { get; }
|
||||||
var view = camera.View;
|
private int RenderDimensionsY { get; }
|
||||||
var projection = camera.Projection;
|
|
||||||
|
|
||||||
|
private RenderTarget2D DepthRenderTarget { get; }
|
||||||
|
private SimpleDepthEffect SimpleDepthEffect { get; }
|
||||||
|
|
||||||
|
public Renderer(GraphicsDevice graphicsDevice, int renderDimensionsX, int renderDimensionsY)
|
||||||
|
{
|
||||||
|
GraphicsDevice = graphicsDevice;
|
||||||
|
RenderDimensionsX = renderDimensionsX;
|
||||||
|
RenderDimensionsY = renderDimensionsY;
|
||||||
|
|
||||||
|
DepthRenderTarget = new RenderTarget2D(
|
||||||
|
GraphicsDevice,
|
||||||
|
renderDimensionsX,
|
||||||
|
renderDimensionsY,
|
||||||
|
false,
|
||||||
|
SurfaceFormat.Color,
|
||||||
|
DepthFormat.Depth24
|
||||||
|
);
|
||||||
|
|
||||||
|
SimpleDepthEffect = new SimpleDepthEffect(GraphicsDevice);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Render(Camera camera, IEnumerable<Model> models, IEnumerable<PointLight> pointLights)
|
||||||
|
{
|
||||||
|
Render(camera.View, camera.Projection, models, pointLights);
|
||||||
|
}
|
||||||
|
|
||||||
|
// for shadow mapping
|
||||||
|
public void DepthRender(Matrix view, Matrix projection, IEnumerable<(Model, Matrix)> modelTransforms, IEnumerable<PointLight> pointLights)
|
||||||
|
{
|
||||||
|
GraphicsDevice.SetRenderTarget(DepthRenderTarget);
|
||||||
|
GraphicsDevice.Clear(ClearOptions.DepthBuffer, Color.Black, 1, 0);
|
||||||
|
|
||||||
|
SimpleDepthEffect.View = view;
|
||||||
|
SimpleDepthEffect.Projection = projection;
|
||||||
|
|
||||||
|
foreach (var (model, transform) in modelTransforms)
|
||||||
|
{
|
||||||
|
foreach (var modelMesh in model.Meshes)
|
||||||
|
{
|
||||||
|
foreach (var meshPart in modelMesh.MeshParts)
|
||||||
|
{
|
||||||
|
GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);
|
||||||
|
GraphicsDevice.Indices = meshPart.IndexBuffer;
|
||||||
|
|
||||||
|
SimpleDepthEffect.Model = transform;
|
||||||
|
|
||||||
|
foreach (var pass in SimpleDepthEffect.CurrentTechnique.Passes)
|
||||||
|
{
|
||||||
|
pass.Apply();
|
||||||
|
|
||||||
|
GraphicsDevice.DrawIndexedPrimitives(
|
||||||
|
PrimitiveType.TriangleList,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
meshPart.VertexBuffer.VertexCount,
|
||||||
|
0,
|
||||||
|
meshPart.Triangles.Length
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Render(Matrix view, Matrix projection, IEnumerable<Model> models, IEnumerable<PointLight> pointLights)
|
||||||
|
{
|
||||||
foreach (var model in models)
|
foreach (var model in models)
|
||||||
{
|
{
|
||||||
foreach (var modelMesh in model.Meshes)
|
foreach (var modelMesh in model.Meshes)
|
||||||
{
|
{
|
||||||
foreach (var meshPart in modelMesh.MeshParts)
|
foreach (var meshPart in modelMesh.MeshParts)
|
||||||
{
|
{
|
||||||
graphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);
|
GraphicsDevice.SetVertexBuffer(meshPart.VertexBuffer);
|
||||||
graphicsDevice.Indices = meshPart.IndexBuffer;
|
GraphicsDevice.Indices = meshPart.IndexBuffer;
|
||||||
|
|
||||||
if (meshPart.Effect is TransformEffect transformEffect)
|
if (meshPart.Effect is TransformEffect transformEffect)
|
||||||
{
|
{
|
||||||
|
@ -40,7 +106,7 @@ namespace Kav
|
||||||
{
|
{
|
||||||
pass.Apply();
|
pass.Apply();
|
||||||
|
|
||||||
graphicsDevice.DrawIndexedPrimitives(
|
GraphicsDevice.DrawIndexedPrimitives(
|
||||||
PrimitiveType.TriangleList,
|
PrimitiveType.TriangleList,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
|
13
Resources.cs
13
Resources.cs
|
@ -16,7 +16,20 @@ namespace Kav
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static byte[] SimpleDepthEffect
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (simpleDepthEffect == null)
|
||||||
|
{
|
||||||
|
simpleDepthEffect = GetResource("SimpleDepthEffecT");
|
||||||
|
}
|
||||||
|
return simpleDepthEffect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static byte[] pbrEffect;
|
private static byte[] pbrEffect;
|
||||||
|
private static byte[] simpleDepthEffect;
|
||||||
|
|
||||||
private static byte[] GetResource(string name)
|
private static byte[] GetResource(string name)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue