/// <summary> /// Should always be created through Backend.CreateSpriteBatch /// </summary> internal SpriteBatch(Backend backend, Renderer.RenderSystem renderSystem, Common.ResourceManager resourceManager) { if (backend == null) throw new ArgumentNullException("backend"); if (renderSystem == null) throw new ArgumentNullException("renderSystem"); if (resourceManager == null) throw new ArgumentNullException("resourceManager"); Backend = backend; Buffer = new BatchBuffer(renderSystem, new Renderer.VertexFormat(new Renderer.VertexFormatElement[] { new Renderer.VertexFormatElement(Renderer.VertexFormatSemantic.Position, Renderer.VertexPointerType.Float, 3, 0), new Renderer.VertexFormatElement(Renderer.VertexFormatSemantic.TexCoord, Renderer.VertexPointerType.Float, 2, sizeof(float) * 3), new Renderer.VertexFormatElement(Renderer.VertexFormatSemantic.Color, Renderer.VertexPointerType.Float, 4, sizeof(float) * 5), }), 32); Shader = resourceManager.Load<Resources.ShaderProgram>("/shaders/sprite"); ShaderSRGB = resourceManager.Load<Resources.ShaderProgram>("/shaders/sprite", "SRGB"); Quads = new List<QuadInfo>(); for (var i = 0; i < 32; i++) { Quads.Add(new QuadInfo()); } RenderStateAlphaBlend = Backend.CreateRenderState(true, false, false, Renderer.BlendingFactorSrc.SrcAlpha, Renderer.BlendingFactorDest.OneMinusSrcAlpha, Renderer.CullFaceMode.Front); RenderStateNoAlphaBlend = Backend.CreateRenderState(false, false, false, Renderer.BlendingFactorSrc.Zero, Renderer.BlendingFactorDest.One, Renderer.CullFaceMode.Front); }
public Tonemap(Backend backend, Common.ResourceManager resourceManager, BatchBuffer quadMesh) : base(backend, resourceManager, quadMesh) { Shader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/tonemap"); BlurSampler = 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 } }); Samplers = new int[] { Backend.DefaultSamplerNoFiltering, Backend.DefaultSamplerNoFiltering, BlurSampler, BlurSampler }; }
public LensFlares(Backend backend, Common.ResourceManager resourceManager, BatchBuffer quadMesh) : base(backend, resourceManager, quadMesh) { HighPassShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/highpass"); BlurHorizontalShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/blur", "BLUR_HORIZONTAL"); BlurVerticalShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/blur", "BLUR_VERTICAL"); QuadShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/quad"); LensFlaresShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/lensflares"); // Setup rendertargets var width = backend.Width; var height = backend.Height; BlurTargets = new RenderTarget[] { Backend.CreateRenderTarget("blur_down_src", 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), })), Backend.CreateRenderTarget("blur_down_2", new Definition(width / 2, height / 2, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0), })), Backend.CreateRenderTarget("blur_down_4", new Definition(width / 4, height / 4, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0), })), Backend.CreateRenderTarget("blur_down8_1", new Definition(width / 8, height / 8, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0), })), Backend.CreateRenderTarget("blur_down8_2", new Definition(width / 8, height / 8, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.Rgba16f, Renderer.PixelType.Float, 0), })), }; BlurSampler = 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 } }); }
public AdaptLuminance(Backend backend, Common.ResourceManager resourceManager, BatchBuffer quadMesh) : base(backend, resourceManager, quadMesh) { LuminanceMapShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/luminance_map"); AdaptLuminanceShader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/adapt_luminance"); // Setup render targets LuminanceTarget = Backend.CreateRenderTarget("avg_luminance", new Definition(1024, 1024, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.R32f, Renderer.PixelType.Float, 0, true), })); AdaptLuminanceTargets = new RenderTarget[] { Backend.CreateRenderTarget("adapted_luminance_0", new Definition(1, 1, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.R16f, Renderer.PixelType.Float, 0), })), Backend.CreateRenderTarget("adapted_luminance_1", new Definition(1, 1, false, new List<Definition.Attachment>() { new Definition.Attachment(Definition.AttachmentPoint.Color, Renderer.PixelFormat.Rgba, Renderer.PixelInternalFormat.R16f, Renderer.PixelType.Float, 0), })) }; }
public Gamma(Backend backend, Common.ResourceManager resourceManager, BatchBuffer quadMesh) : base(backend, resourceManager, quadMesh) { Shader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/gamma"); }
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 } }); }
public ScreenSpaceReflections(Backend backend, Common.ResourceManager resourceManager, BatchBuffer quadMesh) : base(backend, resourceManager, quadMesh) { Shader = ResourceManager.Load<Resources.ShaderProgram>("/shaders/post/screenspacereflections"); }