コード例 #1
0
 public DirectionalLightShaderGroup(ShaderMixinSource mixin, string compositionName, ILightShadowMapShaderGroupData shadowGroupData)
     : base(mixin, compositionName, shadowGroupData)
 {
     CountKey      = DirectLightGroupKeys.LightCount.ComposeWith(compositionName);
     DirectionsKey = LightDirectionalGroupKeys.LightDirectionsWS.ComposeWith(compositionName);
     ColorsKey     = LightDirectionalGroupKeys.LightColor.ComposeWith(compositionName);
 }
コード例 #2
0
 public SpotLightShaderGroup(ShaderMixinSource mixin, string compositionName, ILightShadowMapShaderGroupData shadowGroupData)
     : base(mixin, compositionName, shadowGroupData)
 {
     CountKey  = DirectLightGroupKeys.LightCount.ComposeWith(compositionName);
     LightsKey = LightPointGroupKeys.Lights.ComposeWith(compositionName);
 }
コード例 #3
0
 protected LightShaderGroupDynamic(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroup)
 {
     GraphicsProfile = renderContext.GraphicsDevice.Features.RequestedProfile;
     ShadowGroup = shadowGroup;
 }
コード例 #4
0
ファイル: LightSpotGroupRenderer.cs プロジェクト: cg123/xenko
 public SpotLightShaderGroup(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroupData)
     : base(renderContext, shadowGroupData)
 {
 }
コード例 #5
0
        public override void ProcessLights(ProcessLightsParameters parameters)
        {
            if (parameters.LightCollection.Count == 0)
            {
                return;
            }

            // Check if we have a fallback renderer next in the chain, in case we don't need shadows
            bool hasNextRenderer = parameters.RendererIndex < (parameters.Renderers.Length - 1);

            ILightShadowMapRenderer currentShadowRenderer = null;
            LightShadowType         currentShadowType     = 0;

            // Start by filtering/sorting what can be processed
            shadowComparer.ShadowMapTexturesPerLight = parameters.ShadowMapTexturesPerLight;
            shadowComparer.Lights = parameters.LightCollection;
            parameters.LightIndices.Sort(0, parameters.LightIndices.Count, shadowComparer);

            // Loop over the number of lights + 1 where the last iteration will always flush the last batch of lights
            for (int j = 0; j < parameters.LightIndices.Count + 1;)
            {
                LightShadowType         nextShadowType     = 0;
                ILightShadowMapRenderer nextShadowRenderer = null;

                LightShadowMapTexture nextShadowTexture = null;
                LightComponent        nextLight         = null;
                if (j < parameters.LightIndices.Count)
                {
                    nextLight = parameters.LightCollection[parameters.LightIndices[j]];

                    if (parameters.ShadowMapRenderer != null &&
                        parameters.ShadowMapTexturesPerLight.TryGetValue(nextLight, out nextShadowTexture) &&
                        nextShadowTexture.Atlas != null)    // atlas could not be allocated? treat it as a non-shadowed texture
                    {
                        nextShadowType     = nextShadowTexture.ShadowType;
                        nextShadowRenderer = nextShadowTexture.Renderer;
                    }
                }

                // Flush current group
                if (j == parameters.LightIndices.Count || currentShadowType != nextShadowType || currentShadowRenderer != nextShadowRenderer)
                {
                    if (processedLights.Count > 0)
                    {
                        var lightGroupKey = new LightGroupKey(currentShadowRenderer, currentShadowType);
                        LightShaderGroupDynamic lightShaderGroup;
                        if (!lightShaderGroupPool.TryGetValue(lightGroupKey, out lightShaderGroup))
                        {
                            ILightShadowMapShaderGroupData shadowGroupData = null;
                            if (currentShadowRenderer != null)
                            {
                                shadowGroupData = currentShadowRenderer.CreateShaderGroupData(currentShadowType);
                            }

                            lightShaderGroup = CreateLightShaderGroup(parameters.Context, shadowGroupData);
                            lightShaderGroup.SetViews(parameters.Views);

                            lightShaderGroupPool.Add(lightGroupKey, lightShaderGroup);
                        }

                        // Add view and lights
                        var allowedLightCount = lightShaderGroup.AddView(parameters.ViewIndex, parameters.View, processedLights.Count);
                        for (int i = 0; i < allowedLightCount; ++i)
                        {
                            var light = processedLights[i];
                            lightShaderGroup.AddLight(light.Light, light.ShadowMapTexture);
                        }

                        // TODO: assign extra lights to non-shadow rendering if possible
                        //for (int i = lightCount; i < processedLights.Count; ++i)
                        //    XXX.AddLight(processedLights[i], null);

                        var lightShaderGroupEntry = new LightShaderGroupEntry(lightGroupKey, lightShaderGroup);
                        if (!lightShaderGroups.Contains(lightShaderGroupEntry))
                        {
                            lightShaderGroups.Add(lightShaderGroupEntry);
                        }

                        processedLights.Clear();
                    }

                    // Start next group
                    currentShadowType     = nextShadowType;
                    currentShadowRenderer = nextShadowRenderer;
                }


                if (j < parameters.LightIndices.Count)
                {
                    // Do we need to process non shadowing lights or defer it to something else?
                    if (nextShadowTexture == null && hasNextRenderer)
                    {
                        // Break out so the remaining lights can be handled by the next renderer
                        break;
                    }

                    parameters.LightIndices.RemoveAt(j);
                    processedLights.Add(new LightDynamicEntry(nextLight, nextShadowTexture));
                }
                else
                {
                    j++;
                }
            }

            processedLights.Clear();
        }
コード例 #6
0
ファイル: LightShaderGroup.cs プロジェクト: sonicviz/xenko
 protected LightShaderGroupData(ILightShadowMapShaderGroupData shadowGroup)
 {
     ShadowGroup = shadowGroup;
 }
コード例 #7
0
 public override LightShaderGroupDynamic CreateLightShaderGroup(RenderDrawContext context, ILightShadowMapShaderGroupData shadowShaderGroupData)
 {
     // TODO: This function does not receive any ITextureProjectionShaderGroupData! One of the consequences is the fact that light shafts wont support texture projection.
     return(new SpotLightShaderGroup(context.RenderContext, shadowShaderGroupData, null));
 }
コード例 #8
0
 protected LightShaderGroupDynamic(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroup)
 {
     GraphicsProfile = renderContext.GraphicsDevice.Features.RequestedProfile;
     ShadowGroup     = shadowGroup;
 }
コード例 #9
0
ファイル: LightSpotGroupRenderer.cs プロジェクト: zetz/xenko
 public SpotLightShaderGroup(ILightShadowMapShaderGroupData shadowGroupData)
     : base(shadowGroupData)
 {
 }
コード例 #10
0
 public SpotLightShaderGroup(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroupData, ITextureProjectionShaderGroupData textureProjectionShaderGroupData)
     : base(renderContext, shadowGroupData)
 {
     TextureProjectionShaderGroupData = textureProjectionShaderGroupData;
 }
コード例 #11
0
            public DirectionalLightShaderGroupData(DirectionalLightShaderGroup group, ILightShadowMapShaderGroupData shadowGroupData)
                : base(shadowGroupData)
            {
                countKey  = group.CountKey;
                lightsKey = group.LightsKey;

                lights = new DirectionalLightData[StaticLightMaxCount];
            }
コード例 #12
0
        public override LightShaderGroup CreateLightShaderGroup(string compositionName, int lightMaxCount, ILightShadowMapShaderGroupData shadowGroup)
        {
            var mixin = new ShaderMixinSource();

            if (AllocateLightMaxCount)
            {
                mixin.Mixins.Add(DynamicDirectionalGroupShaderSource);
            }
            else
            {
                mixin.Mixins.Add(new ShaderClassSource("LightDirectionalGroup", lightMaxCount));
                mixin.Mixins.Add(new ShaderClassSource("DirectLightGroupFixed", lightMaxCount));
            }

            if (shadowGroup != null)
            {
                shadowGroup.ApplyShader(mixin);
            }

            return(new DirectionalLightShaderGroup(mixin, compositionName, shadowGroup));
        }
コード例 #13
0
            public DirectionalLightShaderGroupData(DirectionalLightShaderGroup group, ILightShadowMapShaderGroupData shadowGroupData)
                : base(shadowGroupData)
            {
                countKey      = group.CountKey;
                directionsKey = group.DirectionsKey;
                colorsKey     = group.ColorsKey;

                lightDirections = new Vector3[StaticLightMaxCount];
                lightColors     = new Color3[StaticLightMaxCount];
            }
コード例 #14
0
ファイル: LightSkyboxRenderer.cs プロジェクト: rohitshe/Code
        public override LightShaderGroup CreateLightShaderGroup(string compositionName, int lightMaxCount, ILightShadowMapShaderGroupData shadowGroup)
        {
            var mixin = new ShaderMixinGeneratorSource("LightSkyboxEffect");

            return(new LightSkyBoxShaderGroup(mixin, compositionName));
        }
コード例 #15
0
        private ILightShadowMapShaderGroupData CreateShadowMapShaderGroupData(ILightShadowMapRenderer shadowRenderer, LightShadowType shadowType)
        {
            ILightShadowMapShaderGroupData shadowGroupData = shadowRenderer?.CreateShaderGroupData(shadowType);

            return(shadowGroupData);
        }
コード例 #16
0
 public DirectionalLightShaderGroup(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroupData)
     : base(renderContext, shadowGroupData)
 {
 }
コード例 #17
0
 public override LightShaderGroupDynamic CreateLightShaderGroup(RenderDrawContext context, ILightShadowMapShaderGroupData shadowGroup)
 {
     return(new SpotLightShaderGroup(context.RenderContext, shadowGroup));
 }
コード例 #18
0
 public abstract LightShaderGroupDynamic CreateLightShaderGroup(RenderDrawContext context, ILightShadowMapShaderGroupData shadowGroup);
コード例 #19
0
 public SpotLightShaderGroup(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroupData)
     : base(renderContext, shadowGroupData)
 {
 }
コード例 #20
0
ファイル: LightShaderGroup.cs プロジェクト: sonicviz/xenko
 protected LightShaderGroupAndDataPool(ShaderSource mixin, string compositionName, ILightShadowMapShaderGroupData shadowGroupData)
     : base(mixin, compositionName, shadowGroupData)
 {
     dataPool = new PoolListStruct <T>(4, CreateData);
 }
コード例 #21
0
 public DirectionalLightShaderGroup(RenderContext renderContext, ILightShadowMapShaderGroupData shadowGroupData)
     : base(renderContext, shadowGroupData)
 {
 }
コード例 #22
0
 public override LightShaderGroupDynamic CreateLightShaderGroup(RenderDrawContext context,
                                                                ILightShadowMapShaderGroupData shadowShaderGroupData)
 {
     return(new DirectionalLightShaderGroup(context.RenderContext, shadowShaderGroupData));
 }
コード例 #23
0
 public SpotLightShaderGroup(ShaderMixinSource mixin, string compositionName, ILightShadowMapShaderGroupData shadowGroupData)
     : base(mixin, compositionName, shadowGroupData)
 {
     CountKey           = DirectLightGroupKeys.LightCount.ComposeWith(compositionName);
     PositionsKey       = LightPointGroupKeys.LightPositionWS.ComposeWith(compositionName);
     InvSquareRadiusKey = LightPointGroupKeys.LightInvSquareRadius.ComposeWith(compositionName);
     ColorsKey          = LightPointGroupKeys.LightColor.ComposeWith(compositionName);
 }
コード例 #24
0
ファイル: LightSpotGroupRenderer.cs プロジェクト: cg123/xenko
 public override LightShaderGroupDynamic CreateLightShaderGroup(RenderDrawContext context, ILightShadowMapShaderGroupData shadowGroup)
 {
     return new SpotLightShaderGroup(context.RenderContext, shadowGroup);
 }
コード例 #25
0
        public override LightShaderGroup CreateLightShaderGroup(string compositionName, int lightMaxCount, ILightShadowMapShaderGroupData shadowGroup)
        {
            var mixin = new ShaderMixinSource();

            if (AllocateLightMaxCount)
            {
                mixin.Mixins.Add(DynamicDirectionalGroupShaderSource);
            }
            else
            {
                if (lightMaxCount == 0)
                {
                    lightMaxCount = 1;                     //todo verify this.. this is just an hot fix
                }
                mixin.Mixins.Add(new ShaderClassSource("LightPointGroup", lightMaxCount));
                mixin.Mixins.Add(new ShaderClassSource("DirectLightGroupFixed", lightMaxCount));
            }

            if (shadowGroup != null)
            {
                shadowGroup.ApplyShader(mixin);
            }

            return(new SpotLightShaderGroup(mixin, compositionName, shadowGroup));
        }
コード例 #26
0
 public abstract LightShaderGroup CreateLightShaderGroup(string compositionName, int lightMaxCount, ILightShadowMapShaderGroupData shadowGroup);
コード例 #27
0
        public override void ProcessLights(ProcessLightsParameters parameters)
        {
            if (parameters.LightCollection.Count == 0)
            {
                return;
            }

            ILightShadowMapRenderer currentShadowRenderer = null;
            LightShadowType         currentShadowType     = 0;

            // Start by filtering/sorting what can be processed
            shadowComparer.ShadowMapTexturesPerLight = parameters.ShadowMapTexturesPerLight;
            parameters.LightCollection.Sort(parameters.LightStart, parameters.LightEnd - parameters.LightStart, shadowComparer);

            for (int index = parameters.LightStart; index <= parameters.LightEnd; index++)
            {
                LightShadowType         nextShadowType     = 0;
                ILightShadowMapRenderer nextShadowRenderer = null;

                LightShadowMapTexture nextShadowTexture = null;
                LightComponent        nextLight         = null;
                if (index < parameters.LightEnd)
                {
                    nextLight = parameters.LightCollection[index];

                    if (parameters.ShadowMapRenderer != null &&
                        parameters.ShadowMapTexturesPerLight.TryGetValue(nextLight, out nextShadowTexture) &&
                        nextShadowTexture.Atlas != null)    // atlas could not be allocated? treat it as a non-shadowed texture
                    {
                        nextShadowType     = nextShadowTexture.ShadowType;
                        nextShadowRenderer = nextShadowTexture.Renderer;
                    }
                }

                // Flush current group
                if (index == parameters.LightEnd || currentShadowType != nextShadowType || currentShadowRenderer != nextShadowRenderer)
                {
                    if (processedLights.Count > 0)
                    {
                        var lightGroupKey = new LightGroupKey(currentShadowRenderer, currentShadowType);
                        LightShaderGroupDynamic lightShaderGroup;
                        if (!lightShaderGroupPool.TryGetValue(lightGroupKey, out lightShaderGroup))
                        {
                            ILightShadowMapShaderGroupData shadowGroupData = null;
                            if (currentShadowRenderer != null)
                            {
                                shadowGroupData = currentShadowRenderer.CreateShaderGroupData(currentShadowType);
                            }

                            lightShaderGroup = CreateLightShaderGroup(parameters.Context, shadowGroupData);
                            lightShaderGroup.SetViews(parameters.Views);

                            lightShaderGroupPool.Add(lightGroupKey, lightShaderGroup);
                        }

                        // Add view and lights
                        var allowedLightCount = lightShaderGroup.AddView(parameters.ViewIndex, parameters.View, processedLights.Count);
                        for (int i = 0; i < allowedLightCount; ++i)
                        {
                            var light = processedLights[i];
                            lightShaderGroup.AddLight(light.Light, light.ShadowMapTexture);
                        }

                        // TODO: assign extra lights to non-shadow rendering if possible
                        //for (int i = lightCount; i < processedLights.Count; ++i)
                        //    XXX.AddLight(processedLights[i], null);

                        var lightShaderGroupEntry = new LightShaderGroupEntry(lightGroupKey, lightShaderGroup);
                        if (!lightShaderGroups.Contains(lightShaderGroupEntry))
                        {
                            lightShaderGroups.Add(lightShaderGroupEntry);
                        }

                        processedLights.Clear();
                    }

                    // Start next group
                    currentShadowType     = nextShadowType;
                    currentShadowRenderer = nextShadowRenderer;
                }

                if (index < parameters.LightEnd)
                {
                    // Do we need to process non shadowing lights or defer it to something else?
                    if (nextShadowTexture == null && NonShadowRenderer != null)
                    {
                        parameters.LightStart = index;
                        NonShadowRenderer.ProcessLights(parameters);
                        break;
                    }

                    processedLights.Add(new LightDynamicEntry(nextLight, nextShadowTexture));
                }
            }

            processedLights.Clear();
        }