public PostEffectManager(Common.IO.FileSystem fileSystem, Common.ResourceManager resourceManager, Backend backend, int width, int height) { if (fileSystem == null) throw new ArgumentNullException("fileSystem"); if (resourceManager == null) throw new ArgumentNullException("resourceManager"); if (backend == null) throw new ArgumentNullException("backend"); ResourceManager = resourceManager; Backend = backend; RenderTargetManager = new Post.RenderTargetManager(Backend); TemporaryRenderTargets[0] = Backend.CreateRenderTarget("post_0", new Definition(width, height, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0) })); TemporaryRenderTargets[1] = Backend.CreateRenderTarget("post_1", new Definition(width, height, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0) })); QuadMesh = Backend.CreateBatchBuffer(); QuadMesh.Begin(); QuadMesh.AddQuad(new Vector2(-1, -1), new Vector2(2, 2), Vector2.Zero, new Vector2(1, 1)); QuadMesh.End(); Sprite = Backend.CreateSpriteBatch(); // Setup effects ScreenSpaceReflections = new Effects.ScreenSpaceReflections(Backend, ResourceManager, QuadMesh); AdaptLuminance = new Effects.AdaptLuminance(Backend, ResourceManager, QuadMesh); Bloom = new Effects.Bloom(Backend, ResourceManager, QuadMesh); LensFlares = new Effects.LensFlares(Backend, ResourceManager, QuadMesh); Tonemap = new Effects.Tonemap(Backend, ResourceManager, QuadMesh); Gamma = new Effects.Gamma(Backend, ResourceManager, QuadMesh); FXAA = new Effects.FXAA(Backend, ResourceManager, QuadMesh); SMAA = new Effects.SMAA(Backend, fileSystem, ResourceManager, QuadMesh); // Default settings HDRSettings.KeyValue = 0.115f; HDRSettings.AdaptationRate = 0.5f; HDRSettings.BlurSigma = 3.0f; HDRSettings.BloomThreshold = 9.0f; HDRSettings.EnableBloom = true; HDRSettings.EnableLensFlares = true; ScreenSpaceReflectionsSettings.Enable = false; }
public DeferredRenderer(Common.ResourceManager resourceManager, Backend backend, int width, int height) { if (resourceManager == null) throw new ArgumentNullException("resourceManager"); if (backend == null) throw new ArgumentNullException("backend"); Settings.ShadowQuality = ShadowQuality.High; Settings.EnableShadows = true; Settings.ShadowRenderDistance = 128.0f; ResourceManager = resourceManager; Backend = backend; ScreenSize = new Vector2(width, height); GBuffer = Backend.CreateRenderTarget("gbuffer", new Definition(width, height, true, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0), new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.UnsignedByte, 1), new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 2), new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent24, Renderer.PixelType.Float, 0) })); LightAccumulation = Backend.CreateRenderTarget("light_accumulation", new Definition(width, height, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0), new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent24, Renderer.PixelType.Float, 0) })); Temporary = Backend.CreateRenderTarget("deferred_temp", new Definition(width, height, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0) })); Output = Backend.CreateRenderTarget("deferred_output", new Definition(width, height, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0) })); SpotShadowsRenderTarget = Backend.CreateRenderTarget("spot_shadows", new Definition(512, 512, true, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent16, Renderer.PixelType.Float, 0), })); PointShadowsRenderTarget = Backend.CreateRenderTarget("point_shadows", new Definition(512, 512, true, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent16, Renderer.PixelType.Float, 0), }, true)); int cascadeResolution = 2048; DirectionalShadowsRenderTarget = new RenderTarget[] { Backend.CreateRenderTarget("directional_shadows_csm0", new Definition(cascadeResolution, cascadeResolution, true, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent16, Renderer.PixelType.Float, 0), })), Backend.CreateRenderTarget("directional_shadows_csm1", new Definition(cascadeResolution, cascadeResolution, true, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent16, Renderer.PixelType.Float, 0), })), Backend.CreateRenderTarget("directional_shadows_csm2", new Definition(cascadeResolution, cascadeResolution, true, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Depth, Renderer.PixelFormat.DepthComponent, Renderer.PixelInternalFormat.DepthComponent16, Renderer.PixelType.Float, 0), })) }; AmbientLightShader = ResourceManager.Load<Triton.Graphics.Resources.ShaderProgram>("/shaders/deferred/ambient"); // Init light shaders var lightTypes = new string[] { "DIRECTIONAL_LIGHT", "POINT_LIGHT", "SPOT_LIGHT" }; var lightPermutations = new string[] { "NO_SHADOWS", "SHADOWS;SHADOW_QUALITY_LOWEST", "SHADOWS;SHADOW_QUALITY_LOW", "SHADOWS;SHADOW_QUALITY_MEDIUM", "SHADOWS;SHADOW_QUALITY_HIGH" }; LightShaders = new Resources.ShaderProgram[lightTypes.Length * lightPermutations.Length]; LightParams = new LightParams[lightTypes.Length * lightPermutations.Length]; for (var l = 0; l < lightTypes.Length; l++) { var lightType = lightTypes[l]; for (var p = 0; p < lightPermutations.Length; p++) { var index = l * lightPermutations.Length + p; var defines = lightType + ";" + lightPermutations[p]; if (lightType == "POINT_LIGHT") defines += ";SHADOWS_CUBE"; LightShaders[index] = ResourceManager.Load<Triton.Graphics.Resources.ShaderProgram>("/shaders/deferred/light", defines); LightParams[index] = new LightParams(); } } DirectionalShaderOffset = 0; PointLightShaderOffset = 1 * lightPermutations.Length; SpotLightShaderOffset = 2 * lightPermutations.Length; CombineShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/deferred/combine"); RenderShadowsShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/deferred/render_shadows"); RenderShadowsSkinnedShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/deferred/render_shadows", "SKINNED"); RenderShadowsCubeShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/deferred/render_shadows_cube"); RenderShadowsSkinnedCubeShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/deferred/render_shadows_cube", "SKINNED"); FogShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/deferred/fog"); RandomNoiseTexture = ResourceManager.Load<Triton.Graphics.Resources.Texture>("/textures/random_n"); QuadMesh = Backend.CreateBatchBuffer(); QuadMesh.Begin(); QuadMesh.AddQuad(new Vector2(-1, -1), new Vector2(2, 2), Vector2.Zero, new Vector2(1, 1)); QuadMesh.End(); UnitSphere = ResourceManager.Load<Triton.Graphics.Resources.Mesh>("/models/unit_sphere"); UnitCone = ResourceManager.Load<Triton.Graphics.Resources.Mesh>("/models/unit_cone"); AmbientRenderState = Backend.CreateRenderState(true, false, false, Triton.Renderer.BlendingFactorSrc.One, Triton.Renderer.BlendingFactorDest.One); LightAccumulatinRenderState = Backend.CreateRenderState(true, false, false, Triton.Renderer.BlendingFactorSrc.One, Triton.Renderer.BlendingFactorDest.One); ShadowsRenderState = Backend.CreateRenderState(false, true, true); DirectionalRenderState = Backend.CreateRenderState(true, false, false, Triton.Renderer.BlendingFactorSrc.One, Triton.Renderer.BlendingFactorDest.One, Renderer.CullFaceMode.Back, true, Triton.Renderer.DepthFunction.Lequal); LightInsideRenderState = Backend.CreateRenderState(true, false, false, Triton.Renderer.BlendingFactorSrc.One, Triton.Renderer.BlendingFactorDest.One, Triton.Renderer.CullFaceMode.Front, true, Renderer.DepthFunction.Gequal); LightOutsideRenderState = Backend.CreateRenderState(true, false, false, Triton.Renderer.BlendingFactorSrc.One, Triton.Renderer.BlendingFactorDest.One, Renderer.CullFaceMode.Back, true, Triton.Renderer.DepthFunction.Lequal); ShadowSampler = Backend.RenderSystem.CreateSampler(new Dictionary<Renderer.SamplerParameterName, int> { { SamplerParameterName.TextureMinFilter, (int)TextureMinFilter.Linear }, { SamplerParameterName.TextureMagFilter, (int)TextureMinFilter.Linear }, { SamplerParameterName.TextureCompareFunc, (int)DepthFunction.Lequal }, { SamplerParameterName.TextureCompareMode, (int)TextureCompareMode.CompareRToTexture }, { SamplerParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge }, { SamplerParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge } }); }