コード例 #1
0
        private MyShadowMapData TSMShadowMap(ScriptableRenderContext context, MyRenderingData 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);

            MyShadowMapData shadowMapData = new MyShadowMapData()
            {
                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);
        }
コード例 #2
0
ファイル: PSM.cs プロジェクト: one-day61/SRP-Demos
        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);
        }
コード例 #3
0
        private MyShadowMapData StandardShadowMap(ScriptableRenderContext context, MyRenderingData 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);

            MyShadowMapData shadowMapData = new MyShadowMapData()
            {
                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);
        }
コード例 #4
0
        //Debug 用
        private void RenderVolumeDepth(CommandBuffer cmd, MyRenderingData renderingData)
        {
            var debugRT = IdentifierPool.Get();

            cmd.GetTemporaryRT(debugRT, renderingData.camera.pixelWidth, renderingData.camera.pixelHeight, 0,
                               FilterMode.Point, RenderTextureFormat.ARGBFloat);
            cmd.SetRenderTarget(debugRT);
            cmd.SetGlobalTexture("_RWVolumeDepthTexture", volumeDepthTexID);

            foreach (var volumeData in visibleVolumes)
            {
                cmd.SetGlobalInt("_VolumeIndex", volumeData.volumeIndex);
                cmd.DrawMesh(volumeData.volume.VolumeMesh, volumeData.volume.transform.localToWorldMatrix, volumeMat, 0,
                             volumeDepthPass);
            }

            cmd.ReleaseTemporaryRT(debugRT);
            IdentifierPool.Release(debugRT);
        }
コード例 #5
0
        void RenderVolumeDepth(ScriptableRenderContext context, RenderingData renderingData)
        {
            var cmd     = CommandBufferPool.Get("Light Volume Depth");
            var debugRT = IdentifierPool.Get();

            cmd.GetTemporaryRT(debugRT, renderingData.camera.pixelWidth, renderingData.camera.pixelHeight, 0, FilterMode.Point, RenderTextureFormat.ARGBFloat);
            cmd.SetRenderTarget(debugRT);
            cmd.SetGlobalTexture("_RWVolumeDepthTexture", VolumeDepthTex);

            foreach (var volumeData in visibleVolumes)
            {
                cmd.SetGlobalInt("_VolumeIndex", volumeData.VolumeIndex);
                cmd.DrawMesh(volumeData.Volume.VolumeMesh, volumeData.Volume.transform.localToWorldMatrix, volumeMat, 0, PassVolumeDepth);
            }

            cmd.ReleaseTemporaryRT(debugRT);
            IdentifierPool.Release(debugRT);

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();
            CommandBufferPool.Release(cmd);
        }
コード例 #6
0
        void RenderLightVolume(ScriptableRenderContext context, RenderingData renderingData)
        {
            var cmd = CommandBufferPool.Get("Light Volume");

            var renderSize = new Vector2Int(renderingData.camera.pixelWidth, renderingData.camera.pixelHeight) / asset.VolumeResolutionScale;
            var rt         = IdentifierPool.Get();

            cmd.GetTemporaryRT(rt, renderSize.x, renderSize.y, 0, FilterMode.Point, RenderTextureFormat.Default);
            cmd.SetRenderTarget(rt, rt);
            cmd.ClearRenderTarget(false, true, Color.black);

            cmd.SetGlobalTexture("_CameraDepthTex", renderingData.DepthTarget);
            cmd.SetCameraParams(renderingData.camera, true);

            float globalExtinction = Mathf.Log(1 / (0.1f)) / asset.VisibilityDistance;

            foreach (var volumeData in visibleVolumes)
            {
                if (!volumeData.Volume.enabled)
                {
                    continue;
                }
                var     light = renderingData.cullResults.visibleLights[volumeData.LightIndex];
                Vector4 lightPos;
                if (light.lightType == LightType.Directional)
                {
                    lightPos = (-light.light.transform.forward).ToVector4(0);
                }
                else
                {
                    lightPos = light.light.transform.position.ToVector4(1);
                }
                cmd.SetGlobalVector("_LightPosition", lightPos);
                cmd.SetGlobalVector("_LightDirection", -light.light.transform.forward);
                cmd.SetGlobalFloat("_LightAngle", Mathf.Cos(Mathf.Deg2Rad * light.spotAngle / 2));
                cmd.SetGlobalVector("_LightColor", light.finalColor * volumeData.Volume.IntensityMultiplier);
                cmd.SetGlobalVector("_WorldCameraPos", renderingData.camera.transform.position);
                cmd.SetGlobalVector("_FrameSize", new Vector4(renderSize.x, renderSize.y, 1f / renderSize.x, 1f / renderSize.y));
                cmd.SetGlobalInt("_Steps", volumeData.Volume.RayMarchingSteps);
                cmd.SetGlobalVector("_RangeLimit", volumeData.Volume.RayMarchingRange);
                cmd.SetGlobalFloat("_IncomingLoss", volumeData.Volume.IncomingLoss);
                cmd.SetGlobalFloat("_LightDistance", volumeData.Volume.LightDistance);
                var extinction = globalExtinction;
                if (volumeData.Volume.ExtinctionOverride)
                {
                    extinction = Mathf.Log(1 / (0.1f)) / volumeData.Volume.VisibilityDistance;
                }
                cmd.SetGlobalVector("_TransmittanceExtinction", new Vector3(extinction, extinction, extinction));
                if (asset.JitterPatterns.Length > 0)
                {
                    cmd.SetGlobalTexture("_SampleNoise", asset.JitterPatterns[renderingData.FrameID % asset.JitterPatterns.Length]);
                }

                if (renderingData.shadowMapData.ContainsKey(volumeData.Volume.light))
                {
                    var shadowData = renderingData.shadowMapData[volumeData.Volume.light];
                    cmd.SetGlobalTexture("_ShadowMap", shadowData.shadowMapIdentifier);
                    cmd.SetGlobalMatrix("_WorldToLight", shadowData.world2Light);

                    cmd.SetGlobalMatrix("_WorldToLight", shadowData.world2Light);
                    cmd.SetGlobalTexture("_ShadowMap", shadowData.shadowMapIdentifier);
                    cmd.SetGlobalFloat("_ShadowBias", shadowData.bias);
                    cmd.SetGlobalInt("_ShadowType", (int)shadowData.ShadowType);
                    cmd.SetGlobalVector("_ShadowParameters", shadowData.ShadowParameters);
                    cmd.SetGlobalMatrix("_ShadowPostTransform", shadowData.postTransform);
                    //cmd.SetGlobalMatrix("_")
                    cmd.SetGlobalInt("_UseShadow", 1);
                }
                else
                {
                    cmd.SetGlobalInt("_UseShadow", 0);
                }

                var boundaryPlanes = volumeData.Volume.GetVolumeBoundFaces(renderingData.camera);
                cmd.SetGlobalVectorArray("_BoundaryPlanes", boundaryPlanes);
                cmd.SetGlobalInt("_BoundaryPlaneCount", boundaryPlanes.Count);

                switch (light.lightType)
                {
                case LightType.Point:
                case LightType.Spot:
                    cmd.DrawMesh(volumeData.Volume.VolumeMesh, volumeData.Volume.transform.localToWorldMatrix, volumeMat, 0, PassVolumeScattering);
                    break;

                case LightType.Directional:
                    cmd.BlitFullScreen(BuiltinRenderTextureType.None, rt, volumeMat, PassFullScreenVolumeScattering);
                    break;
                }

                //cmd.DrawMesh(volumeData.Volume.VolumeMesh, volumeData.Volume.transform.localToWorldMatrix, volumeMat, 0, PassVolumeScattering);
            }

            cmd.SetGlobalTexture("_CameraDepthTex", renderingData.DepthTarget);
            cmd.SetGlobalFloat("_GlobalFogExtinction", globalExtinction);
            cmd.SetGlobalColor("_AmbientLight", asset.FogLight);
            //cmd.Blit(BuiltinRenderTextureType.None, renderingData.ColorTarget, volumeMat, PassGlobalFog);
            cmd.BlitFullScreen(BuiltinRenderTextureType.None, renderingData.ColorTarget, volumeMat, PassGlobalFog);

            cmd.Blit(rt, renderingData.ColorTarget, volumeMat, PassVolumeResolve);


            //cmd.ReleaseTemporaryRT(rt);
            //IdentifierPool.Release(rt);
            cmd.ReleaseTemporaryRT(rt);
            IdentifierPool.Release(rt);

            context.ExecuteCommandBuffer(cmd);
            cmd.Clear();
            CommandBufferPool.Release(cmd);
        }