public SMAA(Backend backend, Common.IO.FileSystem fileSystem, Common.ResourceManager resourceManager, BatchBuffer quadMesh) : base(backend, resourceManager, quadMesh) { var width = Backend.Width; var height = Backend.Height; var pixelSizeDefine = string.Format("SMAA_PIXEL_SIZE float2(1.0 / {0}, 1.0 / {1})", Common.StringConverter.ToString(width), Common.StringConverter.ToString(height)); var qualities = new string[] { "SMAA_PRESET_LOW", "SMAA_PRESET_MEDIUM", "SMAA_PRESET_HIGH", "SMAA_PRESET_ULTRA" }; for (var i = 0; i < 4; i++ ) { var defines = pixelSizeDefine + ";" + qualities[i] + " 1"; EdgeShader[i] = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/smaa_edge", defines); BlendShader[i] = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/smaa_blend", defines); NeighborhoodShader[i] = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/smaa_neighborhood", defines); } LinearClampSampler = Backend.RenderSystem.CreateSampler(new Dictionary<SamplerParameterName, int> { { SamplerParameterName.TextureMinFilter, (int)TextureMinFilter.Linear }, { SamplerParameterName.TextureMagFilter, (int)TextureMagFilter.Linear }, { SamplerParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge }, { SamplerParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge } }); NearClampSampler = Backend.RenderSystem.CreateSampler(new Dictionary<SamplerParameterName, int> { { SamplerParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest }, { SamplerParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest }, { SamplerParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge }, { SamplerParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge } }); AreaTexture = Backend.CreateTexture("/textures/smaa_area", 160, 560, PixelFormat.Rg, PixelInternalFormat.Rg8, PixelType.UnsignedByte, GetRawTexture(fileSystem, "/textures/smaa_area.raw"), false); SearchTexture = Backend.CreateTexture("/textures/smaa_search", 66, 33, PixelFormat.Red, PixelInternalFormat.R8, PixelType.UnsignedByte, GetRawTexture(fileSystem, "/textures/smaa_search.raw"), false); EdgeRenderTarget = Backend.CreateRenderTarget("smaa_edge", 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), })); BlendRenderTarget = Backend.CreateRenderTarget("smaa_blend", 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), })); }
/// <summary> /// Loads an image from a file into a newly-created texture. /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static Resources.Texture LoadImageToTexture(this string fileName, TextureTarget target = TextureTarget.Texture2D, PixelInternalFormat internalFormat = PixelInternalFormat.Rgb, PixelFormat pixelFormat = PixelFormat.Rgb, PixelType pixelType = PixelType.UnsignedByte) { ImageInfo info; var imageData = fileName.LoadImage(out info); Resources.Texture tex = new Resources.Texture(fileName, info.Width, info.Height, target, internalFormat, pixelFormat, pixelType); tex .Set(TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear) .Set(TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear) .Set(TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge) .Set(TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); tex.ReadyForContent += (s, e) => { tex.Upload(imageData); }; return(tex); }
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 } }); }