Refactored deferred lights code, and skipping SSAA when sample count is 1

This commit is contained in:
dexy
2019-12-04 17:54:48 +11:00
Unverified
parent 1843d70652
commit 152d439f89
19 changed files with 480 additions and 183 deletions
+13 -15
View File
@@ -61,7 +61,7 @@ namespace CodeWalker.Rendering
public bool deferred = Settings.Default.Deferred;
public bool hdr = Settings.Default.HDR;
public float hdrLumBlendSpeed = 1.0f;
public float hdrLumBlendSpeed = 2.0f;
int Width;
int Height;
@@ -645,22 +645,20 @@ namespace CodeWalker.Rendering
context.OutputMerger.BlendState = bsDefault;
context.OutputMerger.DepthStencilState = dsDisableAll;
if (DefScene != null)
{
if (HDR != null)
{
HDR.SetPrimary(context);
}
else
{
DXMan.SetDefaultRenderTarget(context);
}
DefScene.FinalPass(context);
}
if (HDR != null)
{
HDR.Render(DXMan, CurrentElapsedTime);
if ((DefScene?.SSAASampleCount ?? 1) > 1)
{
HDR.SetPrimary(context);
DefScene.SSAAPass(context);
}
HDR.Render(DXMan, CurrentElapsedTime, DefScene);
}
else if (DefScene != null)
{
DXMan.SetDefaultRenderTarget(context);
DefScene.SSAAPass(context);
}
Basic.Deferred = deferred;
+60 -45
View File
@@ -41,7 +41,7 @@ namespace CodeWalker.Rendering
public uint Pad1;
}
public struct DeferredMSAAPSVars
public struct DeferredSSAAPSVars
{
public uint SampleCount;
public float SampleMult;
@@ -64,8 +64,10 @@ namespace CodeWalker.Rendering
int Height = 0;
ViewportF Viewport;
VertexShader LightVS;
PixelShader LightPS;
VertexShader DirLightVS;
PixelShader DirLightPS;
VertexShader LodLightVS;
PixelShader LodLightPS;
UnitCone LightCone;
UnitSphere LightSphere;
UnitCapsule LightCapsule;
@@ -77,12 +79,11 @@ namespace CodeWalker.Rendering
GpuVarsBuffer<DeferredLightPSVars> LightPSVars;
int MSAASampleCount = 1;
VertexShader FinalVS;
PixelShader MSAAPS;
GpuVarsBuffer<DeferredMSAAPSVars> MSAAPSVars;
PixelShader SSAAPS;
GpuVarsBuffer<DeferredSSAAPSVars> SSAAPSVars;
public int SSAASampleCount = 1;
public long VramUsage
@@ -99,18 +100,22 @@ namespace CodeWalker.Rendering
{
var device = dxman.device;
byte[] bLightVS = File.ReadAllBytes("Shaders\\LightVS.cso");
byte[] bLightPS = File.ReadAllBytes("Shaders\\LightPS.cso");
byte[] bDirLightVS = File.ReadAllBytes("Shaders\\DirLightVS.cso");
byte[] bDirLightPS = File.ReadAllBytes("Shaders\\DirLightPS.cso");
byte[] bLodLightVS = File.ReadAllBytes("Shaders\\LodLightsVS.cso");
byte[] bLodLightPS = File.ReadAllBytes("Shaders\\LodLightsPS.cso");
byte[] bFinalVS = File.ReadAllBytes("Shaders\\PPFinalPassVS.cso");
byte[] bMSAAPS = File.ReadAllBytes("Shaders\\PPMSAAPS.cso");
byte[] bSSAAPS = File.ReadAllBytes("Shaders\\PPSSAAPS.cso");
LightVS = new VertexShader(device, bLightVS);
LightPS = new PixelShader(device, bLightPS);
LightCone = new UnitCone(device, bLightVS, 4, false);
LightSphere = new UnitSphere(device, bLightVS, 4, true);
LightCapsule = new UnitCapsule(device, bLightVS, 4, false);
DirLightVS = new VertexShader(device, bDirLightVS);
DirLightPS = new PixelShader(device, bDirLightPS);
LodLightVS = new VertexShader(device, bLodLightVS);
LodLightPS = new PixelShader(device, bLodLightPS);
LightCone = new UnitCone(device, bLodLightVS, 4, false);
LightSphere = new UnitSphere(device, bLodLightVS, 4, true);
LightCapsule = new UnitCapsule(device, bLodLightVS, 4, false);
LightQuad = new UnitQuad(device, true);
LightQuadLayout = new InputLayout(device, bLightVS, new[]
LightQuadLayout = new InputLayout(device, bDirLightVS, new[]
{
new InputElement("POSITION", 0, Format.R32G32B32A32_Float, 0, 0),
new InputElement("TEXCOORD", 0, Format.R32G32_Float, 16, 0),
@@ -121,9 +126,9 @@ namespace CodeWalker.Rendering
FinalVS = new VertexShader(device, bFinalVS);
MSAAPS = new PixelShader(device, bMSAAPS);
SSAAPS = new PixelShader(device, bSSAAPS);
MSAAPSVars = new GpuVarsBuffer<DeferredMSAAPSVars>(device);
SSAAPSVars = new GpuVarsBuffer<DeferredSSAAPSVars>(device);
TextureAddressMode a = TextureAddressMode.Clamp;
Color4 b = new Color4(0.0f, 0.0f, 0.0f, 0.0f);
@@ -188,25 +193,35 @@ namespace CodeWalker.Rendering
LightCapsule.Dispose();
LightCapsule = null;
}
if (LightPS != null)
if (DirLightPS != null)
{
LightPS.Dispose();
LightPS = null;
DirLightPS.Dispose();
DirLightPS = null;
}
if (LightVS != null)
if (DirLightVS != null)
{
LightVS.Dispose();
LightVS = null;
DirLightVS.Dispose();
DirLightVS = null;
}
if (MSAAPSVars != null)
if (LodLightPS != null)
{
MSAAPSVars.Dispose();
MSAAPSVars = null;
LodLightPS.Dispose();
LodLightPS = null;
}
if (MSAAPS != null)
if (LodLightVS != null)
{
MSAAPS.Dispose();
MSAAPS = null;
LodLightVS.Dispose();
LodLightVS = null;
}
if (SSAAPSVars != null)
{
SSAAPSVars.Dispose();
SSAAPSVars = null;
}
if (SSAAPS != null)
{
SSAAPS.Dispose();
SSAAPS = null;
}
if (FinalVS != null)
{
@@ -223,8 +238,8 @@ namespace CodeWalker.Rendering
int uw = Width = dxman.backbuffer.Description.Width * MSAASampleCount;
int uh = Height = dxman.backbuffer.Description.Height * MSAASampleCount;
int uw = Width = dxman.backbuffer.Description.Width * SSAASampleCount;
int uh = Height = dxman.backbuffer.Description.Height * SSAASampleCount;
Viewport = new ViewportF();
Viewport.Width = (float)uw;
Viewport.Height = (float)uh;
@@ -285,8 +300,8 @@ namespace CodeWalker.Rendering
//discard pixels where scene depth is 0, since nothing was rendered there
//blend mode: overwrite
context.VertexShader.Set(LightVS);
context.PixelShader.Set(LightPS);
context.VertexShader.Set(DirLightVS);
context.PixelShader.Set(DirLightPS);
LightVSVars.Vars.ViewProj = Matrix.Identity; //Matrix.Transpose(camera.ViewProjMatrix);
LightVSVars.Vars.CameraPos = Vector4.Zero; //new Vector4(camera.Position, 0.0f);
@@ -336,8 +351,8 @@ namespace CodeWalker.Rendering
//blend mode: additive
context.VertexShader.Set(LightVS);
context.PixelShader.Set(LightPS);
context.VertexShader.Set(LodLightVS);
context.PixelShader.Set(LodLightPS);
LightVSVars.Vars.ViewProj = Matrix.Transpose(camera.ViewProjMatrix);
LightVSVars.Vars.CameraPos = new Vector4(camera.Position, 0.0f);
@@ -421,22 +436,22 @@ namespace CodeWalker.Rendering
public void FinalPass(DeviceContext context)
public void SSAAPass(DeviceContext context)
{
//do antialiasing from SceneColour into HDR primary
//do antialiasing from SceneColour
context.VertexShader.Set(FinalVS);
context.PixelShader.Set(MSAAPS);
context.PixelShader.Set(SSAAPS);
context.PixelShader.SetShaderResources(0, SceneColour.SRV);
context.PixelShader.SetSamplers(0, SampleStatePoint);
MSAAPSVars.Vars.SampleCount = (uint)MSAASampleCount;
MSAAPSVars.Vars.SampleMult = 1.0f / (MSAASampleCount * MSAASampleCount);
MSAAPSVars.Vars.TexelSizeX = 1.0f / Width;
MSAAPSVars.Vars.TexelSizeY = 1.0f / Height;
MSAAPSVars.Update(context);
MSAAPSVars.SetPSCBuffer(context, 0);
SSAAPSVars.Vars.SampleCount = (uint)SSAASampleCount;
SSAAPSVars.Vars.SampleMult = 1.0f / (SSAASampleCount * SSAASampleCount);
SSAAPSVars.Vars.TexelSizeX = 1.0f / Width;
SSAAPSVars.Vars.TexelSizeY = 1.0f / Height;
SSAAPSVars.Update(context);
SSAAPSVars.SetPSCBuffer(context, 0);
context.InputAssembler.InputLayout = LightQuadLayout;
LightQuad.Draw(context);
+30 -11
View File
@@ -165,6 +165,23 @@ namespace CodeWalker.Rendering
RawViewportF[] vpOld = new RawViewportF[15];
DeferredScene DefScene;
bool UsePrimary = true;
ShaderResourceView SceneColourSRV
{
get
{
var srv = DefScene?.SceneColour?.SRV;
if (UsePrimary || (srv == null))
{
srv = Primary.SRV;
}
return srv;
}
}
public PostProcessor(DXManager dxman)
{
var device = dxman.device;
@@ -417,13 +434,15 @@ namespace CodeWalker.Rendering
context.Rasterizer.SetViewport(Viewport);
}
public void Render(DXManager dxman, float elapsed)
public void Render(DXManager dxman, float elapsed, DeferredScene defScene)
{
ElapsedTime = elapsed;
DefScene = defScene;
UsePrimary = ((defScene?.SSAASampleCount ?? 2) > 1) || (defScene?.SceneColour == null);
var context = dxman.context;
if (Multisampled)
if (Multisampled && UsePrimary)
{
int sr = 0;// D3D11CalcSubresource(0, 0, 1);
context.ResolveSubresource(Primary.TextureMS, sr, Primary.Texture, sr, Format.R32G32B32A32_Float);
@@ -442,6 +461,8 @@ namespace CodeWalker.Rendering
private void ProcessLuminance(DeviceContext context)
{
var srv = SceneColourSRV;
uint dimx, dimy;
if (CS_FULL_PIXEL_REDUCTION)
{
@@ -462,7 +483,8 @@ namespace CodeWalker.Rendering
ReduceCSVars.Vars.Height = (uint)Height;
ReduceCSVars.Update(context);
Compute(context, ReduceTo1DCS, ReduceCSVars.Buffer, Reduction0.UAV, (int)dimx, (int)dimy, 1, Primary.SRV);
Compute(context, ReduceTo1DCS, ReduceCSVars.Buffer, Reduction0.UAV, (int)dimx, (int)dimy, 1, srv);
uint dim = dimx * dimy;
uint nNumToReduce = dim;
@@ -506,13 +528,10 @@ namespace CodeWalker.Rendering
{
if (EnableBloom)
{
var srv = SceneColourSRV;
// Bright pass and horizontal blur
ShaderResourceView view = Primary.SRV;
ShaderResourceView[] aRViews = { view, LumBlendResult.SRV };
//BloomFilterShaderVars cbFilter;
//GetSampleWeights(cbFilter.avSampleWeights, 3.0f, 1.25f);
FilterBPHCSVars.Vars.outputwidth = (uint)(Width / 8);
if (CS_FULL_PIXEL_REDUCTION)
@@ -529,7 +548,7 @@ namespace CodeWalker.Rendering
int x = (int)(Math.Ceiling((float)FilterBPHCSVars.Vars.outputwidth / (128 - 7 * 2)));
int y = (Height / 8);
Compute(context, BloomFilterBPHCS, FilterBPHCSVars.Buffer, Bloom1.UAV, x, y, 1, view, LumBlendResult.SRV);
Compute(context, BloomFilterBPHCS, FilterBPHCSVars.Buffer, Bloom1.UAV, x, y, 1, srv, LumBlendResult.SRV);
// Vertical blur
FilterVCSVars.Vars.outputsize0 = (int)(Width / 8);
@@ -552,16 +571,16 @@ namespace CodeWalker.Rendering
context.VertexShader.Set(FinalPassVS);
context.PixelShader.Set(FinalPassPS);
context.PixelShader.SetShaderResources(0, Primary.SRV, LumBlendResult.SRV, EnableBloom ? Bloom.SRV : null);
var srv = SceneColourSRV;
context.PixelShader.SetShaderResources(0, srv, LumBlendResult.SRV, EnableBloom ? Bloom.SRV : null);
if (CS_FULL_PIXEL_REDUCTION)
{
//pcbCS[0] = 1.0f / (Width * Height);
FinalPSVars.Vars.invPixelCount = new Vector4(1.0f / (Width * Height));
}
else
{
//pcbCS[0] = 1.0f / (81 * 81); //ToneMappingTexSize*ToneMappingTexSize
FinalPSVars.Vars.invPixelCount = new Vector4(1.0f / (81 * 81));
}
FinalPSVars.Update(context);