Esempio n. 1
0
        ShadowMapData PSMShadowMap(ScriptableRenderContext context, RenderingData renderingData, ShadowSettings settings, int lightIndex)
        {
            var(view, projection, inverseZ) = PSMProjection(lightIndex, renderingData);
            //Debug.Log(inverseZ);
            Vector4 p  = new Vector4(-0.46017f, 0.16764f, 0.01015f, 1.00f);
            var     p1 = projection * view * p;
            var     p2 = GL.GetGPUProjectionMatrix(projection, false) * Matrix4x4.Scale(new Vector3(1, 1, -1)) * view * p;

            ShadowMapData shadowMapData = new ShadowMapData()
            {
                shadowMapIdentifier = IdentifierPool.Get(),
                world2Light         = GL.GetGPUProjectionMatrix(projection, true) * Matrix4x4.Scale(new Vector3(1, 1, -1)) * view,
                bias             = settings.Bias,
                ShadowType       = ShadowAlgorithms.PSM,
                ShadowParameters = new Vector4(inverseZ ? 1 : 0, 0, 0),
            };

            var cmd = CommandBufferPool.Get();

            cmd.GetTemporaryRT(shadowMapData.shadowMapIdentifier, settings.Resolution, settings.Resolution, 32, FilterMode.Point, RenderTextureFormat.Depth);
            cmd.SetRenderTarget(shadowMapData.shadowMapIdentifier);
            cmd.SetGlobalVector("_ShadowParameters", shadowMapData.ShadowParameters);
            cmd.SetGlobalDepthBias(1, 1);
            //cmd.SetViewProjectionMatrices(renderingData.camera.worldToCameraMatrix, renderingData.camera.projectionMatrix);
            cmd.ClearRenderTarget(true, true, Color.black);

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();

            DrawShadowCasters(context, renderingData, shadowMapData, PassPSM);

            CommandBufferPool.Release(cmd);

            return(shadowMapData);
        }
Esempio n. 2
0
        ShadowMapData TSMShadowMap(ScriptableRenderContext context, RenderingData renderingData, ShadowSettings settings, int lightIndex)
        {
            var camera = renderingData.camera;

            if (settings.Debug)
            {
                camera = GameObject.Find("Main Camera").GetComponent <Camera>();
            }
            var(view, projection) = GetShadowViewProjection(settings, renderingData, lightIndex);

            var cmd = CommandBufferPool.Get();

            cmd.Clear();
            var depthBuf = IdentifierPool.Get();

            cmd.GetTemporaryRT(depthBuf, settings.Resolution, settings.Resolution, 32, FilterMode.Point, RenderTextureFormat.Depth);

            RenderTargetBinding binding = new RenderTargetBinding();

            binding.depthRenderTarget = depthBuf;
            cmd.SetRenderTarget(depthBuf);
            cmd.ClearRenderTarget(true, true, Color.black);

            ShadowMapData shadowMapData = new ShadowMapData()
            {
                shadowMapIdentifier = depthBuf,
                bias        = settings.Bias,
                ShadowType  = ShadowAlgorithms.TSM,
                world2Light = GL.GetGPUProjectionMatrix(projection, true) * view,
            };

            var trapezoidalTransfrom = TSMTransform(camera, shadowMapData.world2Light, settings);

            shadowMapData.postTransform = trapezoidalTransfrom;


            cmd.SetViewProjectionMatrices(view, projection);
            cmd.SetGlobalDepthBias(settings.DepthBias, settings.NormalBias);
            cmd.SetGlobalMatrix("_ShadowPostTransform", trapezoidalTransfrom);
            cmd.SetGlobalFloat("_SlopeDepthBias", -settings.NormalBias);
            cmd.SetGlobalFloat("_DepthBias", -Mathf.Pow(2, settings.DepthBias));

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();


            DrawShadowCasters(context, renderingData, shadowMapData, PassTSM);

            cmd.SetViewProjectionMatrices(renderingData.camera.worldToCameraMatrix, renderingData.camera.projectionMatrix);

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();

            CommandBufferPool.Release(cmd);

            return(shadowMapData);
        }
Esempio n. 3
0
        ShadowMapData StandardShadowMap(ScriptableRenderContext context, RenderingData renderingData, ShadowSettings settings, int lightIndex)
        {
            var cmd = CommandBufferPool.Get();

            cmd.Clear();
            var depthBuf = IdentifierPool.Get();

            cmd.GetTemporaryRT(depthBuf, settings.Resolution, settings.Resolution, 32, FilterMode.Point, RenderTextureFormat.Depth);

            RenderTargetBinding binding = new RenderTargetBinding();

            binding.depthRenderTarget = depthBuf;
            cmd.SetRenderTarget(depthBuf);
            cmd.ClearRenderTarget(true, true, Color.black);

            ShadowMapData shadowMapData = new ShadowMapData()
            {
                shadowMapIdentifier = depthBuf,
                bias       = settings.Bias,
                ShadowType = ShadowAlgorithms.Standard,
            };



            var(view, projection) = GetShadowViewProjection(settings, renderingData, lightIndex);

            cmd.SetViewProjectionMatrices(view, projection);
            shadowMapData.world2Light = projection * view;
            cmd.SetGlobalDepthBias(settings.DepthBias, settings.NormalBias);

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();


            DrawShadowCasters(context, renderingData, shadowMapData, PassSimple);

            cmd.SetViewProjectionMatrices(renderingData.camera.worldToCameraMatrix, renderingData.camera.projectionMatrix);

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();

            CommandBufferPool.Release(cmd);

            return(shadowMapData);
        }
Esempio n. 4
0
        public override void Render(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            for (var i = 0; i < renderingData.cullResults.visibleLights.Length; i++)
            {
                var light = renderingData.cullResults.visibleLights[i];
                if (light.light.GetComponent <ShadowSettings>() is ShadowSettings shadowSettings)
                {
                    if (!shadowSettings.Shadow)
                    {
                        continue;
                    }
                    ShadowMapData data    = new ShadowMapData();
                    var           hasData = false;
                    switch (shadowSettings.Algorithms)
                    {
                    case ShadowAlgorithms.Standard:
                        data    = StandardShadowMap(context, renderingData, shadowSettings, i);
                        hasData = true;
                        break;

                    case ShadowAlgorithms.PSM:
                        data    = PSMShadowMap(context, renderingData, shadowSettings, i);
                        hasData = true;
                        break;

                    case ShadowAlgorithms.TSM:
                        data    = TSMShadowMap(context, renderingData, shadowSettings, i);
                        hasData = true;
                        break;
                    }
                    if (hasData)
                    {
                        renderingData.shadowMapData[light.light] = data;
                        LightMaps[light.light] = data;
                    }
                }
            }
        }
Esempio n. 5
0
        void DrawShadowCasters(ScriptableRenderContext context, RenderingData renderingData, ShadowMapData shadowMapData, int pass)
        {
            var cmd = CommandBufferPool.Get();

            cmd.SetGlobalMatrix("_LightViewProjection", shadowMapData.world2Light);
            foreach (var renderer in GameObject.FindObjectsOfType <UnityEngine.Renderer>())
            {
                cmd.DrawRenderer(renderer, shadowMapMat, 0, pass);
            }
            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();
            CommandBufferPool.Release(cmd);
        }