public void Initialize(LightComponent lightComponent, IDirectLight light, LightShadowMap shadowMap, int size, ILightShadowMapRenderer renderer) { if (lightComponent == null) { throw new ArgumentNullException("lightComponent"); } if (light == null) { throw new ArgumentNullException("light"); } if (shadowMap == null) { throw new ArgumentNullException("shadowMap"); } if (renderer == null) { throw new ArgumentNullException("renderer"); } LightComponent = lightComponent; Light = light; Shadow = shadowMap; Size = size; FilterType = Shadow.Filter == null || !Shadow.Filter.RequiresCustomBuffer() ? null : Shadow.Filter.GetType(); Renderer = renderer; Atlas = null; // Reset the atlas, It will be setup after ShadowType = renderer.GetShadowType(Shadow); }
private void AssignRectangles(LightShadowMapTexture lightShadowMapTexture) { lightShadowMapTexture.CascadeCount = lightShadowMapTexture.Shadow.GetCascadeCount(); var size = lightShadowMapTexture.Size; // Try to fit the shadow map into an existing atlas foreach (var atlas in atlases) { if (atlas.TryInsert(size, size, lightShadowMapTexture.CascadeCount)) { AssignRectangles(ref lightShadowMapTexture, atlas); return; } } // TODO: handle FilterType texture creation here // TODO: This does not work for Omni lights // Allocate a new atlas texture var texture = Texture.New2D(Context.GraphicsDevice, MaximumTextureSize, MaximumTextureSize, 1, PixelFormat.D32_Float, TextureFlags.DepthStencil | TextureFlags.ShaderResource); var newAtlas = new ShadowMapAtlasTexture(texture, atlases.Count) { FilterType = lightShadowMapTexture.FilterType }; AssignRectangles(ref lightShadowMapTexture, newAtlas); atlases.Add(newAtlas); }
private void AssignRectangles(LightShadowMapTexture lightShadowMapTexture) { lightShadowMapTexture.CascadeCount = lightShadowMapTexture.Shadow.GetCascadeCount(); var size = lightShadowMapTexture.Size; // Try to fit the shadow map into an existing atlas ShadowMapAtlasTexture currentAtlas = null; foreach (var atlas in atlases) { if (atlas.TryInsert(size, size, lightShadowMapTexture.CascadeCount, (int index, ref Rectangle rectangle) => lightShadowMapTexture.SetRectangle(index, rectangle))) { currentAtlas = atlas; break; } } // Allocate a new atlas texture if (currentAtlas == null) { // TODO: handle FilterType texture creation here // TODO: This does not work for Omni lights var texture = Texture.New2D(Context.GraphicsDevice, MaximumTextureSize, MaximumTextureSize, 1, PixelFormat.D32_Float, TextureFlags.DepthStencil | TextureFlags.ShaderResource); currentAtlas = new ShadowMapAtlasTexture(texture, atlases.Count) { FilterType = lightShadowMapTexture.FilterType }; atlases.Add(currentAtlas); for (int i = 0; i < lightShadowMapTexture.CascadeCount; i++) { var rect = Rectangle.Empty; currentAtlas.Insert(size, size, ref rect); lightShadowMapTexture.SetRectangle(i, rect); } } // Make sure the atlas cleared (will be clear just once) currentAtlas.ClearRenderTarget(Context); lightShadowMapTexture.TextureId = (byte)currentAtlas.Id; lightShadowMapTexture.Atlas = currentAtlas; }
private void AssignRectangles(ref LightShadowMapTexture lightShadowMapTexture, ShadowMapAtlasTexture atlas) { // Make sure the atlas cleared (will be clear just once) atlas.ClearRenderTarget(Context); lightShadowMapTexture.TextureId = (byte)atlas.Id; lightShadowMapTexture.Atlas = atlas; var size = lightShadowMapTexture.Size; for (int i = 0; i < lightShadowMapTexture.CascadeCount; i++) { var rect = Rectangle.Empty; atlas.Insert(size, size, ref rect); lightShadowMapTexture.SetRectangle(i, rect); } }
public void Initialize(LightComponent lightComponent, IDirectLight light, LightShadowMap shadowMap, int size, ILightShadowMapRenderer renderer) { if (lightComponent == null) throw new ArgumentNullException("lightComponent"); if (light == null) throw new ArgumentNullException("light"); if (shadowMap == null) throw new ArgumentNullException("shadowMap"); if (renderer == null) throw new ArgumentNullException("renderer"); LightComponent = lightComponent; Light = light; Shadow = shadowMap; Size = size; FilterType = Shadow.Filter == null || !Shadow.Filter.RequiresCustomBuffer() ? null : Shadow.Filter.GetType(); Renderer = renderer; Atlas = null; // Reset the atlas, It will be setup after ShadowType = renderer.GetShadowType(Shadow); }