public override void SetupCullingParameters(ref ScriptableCullingParameters cullingParameters, ref CameraData cameraData)
        {
            ShadowTextureRenderer shadowTextureRenderer = cameraData.camera.GetComponent <ShadowTextureRenderer>();

            if (shadowTextureRenderer == null)
            {
#if UNITY_EDITOR
                Debug.LogWarning("No ShadowTextureRenderer found.");
#endif
                return;
            }
            shadowTextureRenderer.UpdateVisibilityAndPrepareRendering();
            cullingParameters.cullingMask = 0;
            if (shadowTextureRenderer.isProjectorVisible)
            {
                DrawSceneObject drawScene = cameraData.camera.GetComponent <DrawSceneObject>();
                if (drawScene != null)
                {
                    cullingParameters.cullingMask = (uint)drawScene.cullingMask.value;
                }
                DrawTargetObject drawTarget = shadowTextureRenderer.GetComponent <DrawTargetObject>();
                if (drawTarget != null)
                {
                    drawTarget.SendMessage("OnPreCull");
                }
                shadowTextureRenderer.ConfigureRenderTarget(m_renderShadowTexturePass, ref cameraData);
            }
            cullingParameters.cullingOptions = CullingOptions.None;
            cullingParameters.shadowDistance = 0;
        }
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            Camera camera = renderingData.cameraData.camera;

            DynamicShadowProjectorRenderer.DynamicShadowProjectorComponents components = m_renderer.GetDynamicShadowProjectorComponents(renderingData.cameraData.camera);
            ShadowTextureRenderer shadowTextureRenderer = components.shadowTextureRenderer;

            if (shadowTextureRenderer == null || !shadowTextureRenderer.isProjectorVisible)
            {
                return;
            }

            DrawSceneObject drawScene = components.drawSceneObject;

            if (drawScene != null)
            {
                if (m_overrideOpaqueMaterial == null)
                {
                    m_overrideOpaqueMaterial = new Material(shadowTextureRenderer.m_opaqueShadowShaderForLWRP);
                }
                else if (m_overrideOpaqueMaterial.shader != shadowTextureRenderer.m_opaqueShadowShaderForLWRP)
                {
                    m_overrideOpaqueMaterial.shader = shadowTextureRenderer.m_opaqueShadowShaderForLWRP;
                }
                if (m_overrideTransparentMaterial == null)
                {
                    m_overrideTransparentMaterial = new Material(shadowTextureRenderer.m_transparentShadowShaderForLWRP);
                }
                else if (m_overrideTransparentMaterial.shader != shadowTextureRenderer.m_transparentShadowShaderForLWRP)
                {
                    m_overrideTransparentMaterial.shader = shadowTextureRenderer.m_transparentShadowShaderForLWRP;
                }
                DrawingSettings drawingSettings = new DrawingSettings(m_shaderTagIds[0], new SortingSettings(camera));
                for (int i = 1; i < m_shaderTagIds.Length; ++i)
                {
                    drawingSettings.SetShaderPassName(i, m_shaderTagIds[i]);
                }
                // draw opaque objects
                drawingSettings.overrideMaterial          = m_overrideOpaqueMaterial;
                drawingSettings.overrideMaterialPassIndex = 0;
                drawingSettings.enableDynamicBatching     = renderingData.supportsDynamicBatching;
                drawingSettings.enableInstancing          = true;
                drawingSettings.perObjectData             = PerObjectData.None;
                FilteringSettings opaqueFilteringSettings = new FilteringSettings(new RenderQueueRange(RenderQueueRange.opaque.lowerBound, 2500), drawScene.cullingMask);
                context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref opaqueFilteringSettings);
                // draw transparent objects
                drawingSettings.overrideMaterial = m_overrideTransparentMaterial;
                FilteringSettings transparentFilteringSettings = new FilteringSettings(new RenderQueueRange(2500, RenderQueueRange.transparent.upperBound), drawScene.cullingMask);
                context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref transparentFilteringSettings);
            }
            DrawTargetObject drawTarget = components.drawTargetObject;

            if (drawTarget != null)
            {
                context.ExecuteCommandBuffer(drawTarget.commandBuffer);
            }
            shadowTextureRenderer.ExecutePostRenderProcess(context);
        }
Exemplo n.º 3
0
        void OnEnable()
        {
            DrawTargetObject component = target as DrawTargetObject;

            if (component.shadowShader == null && (component.replacementShaders == null || component.replacementShaders.Length == 0))
            {
                component.shadowShader       = FindMaterial("DynamicShadowProjector/Shadow/Opaque");
                component.replacementShaders = new DrawTargetObject.ReplaceShader[2];
                component.replacementShaders[0].renderType = "Transparent";
                component.replacementShaders[0].shader     = Shader.Find("DynamicShadowProjector/Shadow/Transparent");
                component.replacementShaders[1].renderType = "TransparentCutout";
                component.replacementShaders[1].shader     = component.replacementShaders[0].shader;
                serializedObject.Update();
                EditorUtility.SetDirty(component);
            }
        }
Exemplo n.º 4
0
    // 添加阴影
    public void AddShadow()
    {
        Transform body = _body != null ? _body.transform : transform;

        _shadow = ResourceManager.Instance.GetShadowProjector();
        _shadow.transform.SetParent(body);
        _shadow.transform.localPosition = new Vector3(0, 2.2f, -1);
        _shadow.transform.localRotation = Quaternion.Euler(45, 0, 0);
        _shadow.transform.localScale    = Vector3.one;

        DrawTargetObject draw = _shadow.GetComponent <DrawTargetObject>();

        if (draw != null)
        {
            draw.target = body;
        }
    }
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            if (m_rendered)
            {
                // in case of multipass VR, render pass will be called twice even if renderPassEvent == RenderPassEvent.BeforeRendering...
                return;
            }
            CommandBuffer cmd = CommandBufferPool.Get();

            cmd.SetViewProjectionMatrices(m_renderer.projectorCamera.worldToCameraMatrix, m_renderer.projectorCamera.projectionMatrix);
            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
            DrawSceneObject drawScene = m_renderer.drawSceneObject;

            if (drawScene != null)
            {
                ScriptableCullingParameters cullingParameters = new ScriptableCullingParameters();
                if (m_renderer.projectorCamera.TryGetCullingParameters(false, out cullingParameters))
                {
                    cullingParameters.cullingMask = (uint)drawScene.cullingMask.value;
                    CullingResults cullingResults = context.Cull(ref cullingParameters);
                    if (m_overrideOpaqueMaterial == null)
                    {
                        m_overrideOpaqueMaterial = new Material(drawScene.replacementShader);
                    }
                    else if (m_overrideOpaqueMaterial.shader != drawScene.replacementShader)
                    {
                        m_overrideOpaqueMaterial.shader = drawScene.replacementShader;
                    }
                    if (m_overrideAlphaCutoffMaterial == null)
                    {
                        m_overrideAlphaCutoffMaterial = new Material(drawScene.replacementShader);
                        m_overrideAlphaCutoffMaterial.EnableKeyword("_ALPHATEST_ON");
                        m_overrideAlphaCutoffMaterial.SetFloat("_DstBlend", 10.0f);                         // OneMinusSrcAlpha
                    }
                    else if (m_overrideAlphaCutoffMaterial.shader != drawScene.replacementShader)
                    {
                        m_overrideAlphaCutoffMaterial.shader = drawScene.replacementShader;
                    }
                    if (m_overrideTransparentMaterial == null)
                    {
                        m_overrideTransparentMaterial = new Material(drawScene.replacementShader);
                        m_overrideTransparentMaterial.EnableKeyword("_ALPHATEST_ON");
                        m_overrideTransparentMaterial.EnableKeyword("_ALPHABLEND_ON");
                        m_overrideTransparentMaterial.SetFloat("_SrcBlend", 5.0f);                         // SrcAlpha
                        m_overrideTransparentMaterial.SetFloat("_DstBlend", 10.0f);                        // OneMinusSrcAlpha
                    }
                    else if (m_overrideTransparentMaterial.shader != drawScene.replacementShader)
                    {
                        m_overrideTransparentMaterial.shader = drawScene.replacementShader;
                    }
                    DrawingSettings drawingSettings = new DrawingSettings(drawScene.shaderTagIds[0], new SortingSettings(m_renderer.projectorCamera));
                    for (int i = 1; i < drawScene.shaderTagIds.Length; ++i)
                    {
                        drawingSettings.SetShaderPassName(i, drawScene.shaderTagIds[i]);
                    }
                    // draw opaque objects
                    drawingSettings.overrideMaterial          = m_overrideOpaqueMaterial;
                    drawingSettings.overrideMaterialPassIndex = 0;
                    drawingSettings.enableDynamicBatching     = renderingData.supportsDynamicBatching;
                    drawingSettings.enableInstancing          = true;
                    drawingSettings.perObjectData             = PerObjectData.None;
                    FilteringSettings opaqueFilteringSettings = new FilteringSettings(new RenderQueueRange(RenderQueueRange.opaque.lowerBound, 2400), drawScene.cullingMask);
                    context.DrawRenderers(cullingResults, ref drawingSettings, ref opaqueFilteringSettings);
                    // draw alpha-cutoff objects
                    drawingSettings.overrideMaterial = m_overrideAlphaCutoffMaterial;
                    FilteringSettings alphacutoutFilteringSettings = new FilteringSettings(new RenderQueueRange(2400, RenderQueueRange.opaque.upperBound), drawScene.cullingMask);
                    context.DrawRenderers(cullingResults, ref drawingSettings, ref alphacutoutFilteringSettings);
                    // draw transparent objects
                    drawingSettings.overrideMaterial = m_overrideTransparentMaterial;
                    FilteringSettings transparentFilteringSettings = new FilteringSettings(new RenderQueueRange(RenderQueueRange.transparent.lowerBound, RenderQueueRange.transparent.upperBound), drawScene.cullingMask);
                    context.DrawRenderers(cullingResults, ref drawingSettings, ref transparentFilteringSettings);
                }
            }
            DrawTargetObject drawTarget = m_renderer.drawTargetObject;

            if (drawTarget != null)
            {
                context.ExecuteCommandBuffer(drawTarget.commandBuffer);
            }
            m_renderer.ExecutePostRenderProcess(context);
            m_rendered = true;
        }
Exemplo n.º 6
0
    void Awake()
    {
        if (instance != null)
        {
            GameObject.Destroy(this.gameObject);
            return;
        }

        selfTrans = transform;

        m_camera = ArtWrap.mainCamera;
        m_shadowTextureRenderer = GetComponent <ShadowTextureRenderer>();
        if (m_shadowTextureRenderer != null)
        {
            m_shadowTextureRenderer.camerasForViewClipTest = new Camera[] { m_camera }
        }
        ;

        //添加默认的,因为要根据默认的设置参数
        m_defaultDrawObject         = GetComponent <DrawTargetObject>();
        m_defaultDrawObject.enabled = false;
        m_drawObjects = new List <DrawTargetObject>();
        m_drawObjects.Add(m_defaultDrawObject);

        //设置阴影跟随平行光
        SetLight();

        instance = this;
    }

    void OnDestroy()
    {
        instance = null;
    }

    void Update()
    {
        if (m_followTrans != null)
        {
            //设置坐标偏移
            m_posOff = -this.transform.forward * 20;
            selfTrans.parent.position = m_followTrans.position + m_posOff;
        }


        for (int i = m_drawObjects.Count - 1; i >= 0; i--)
        {
            if (m_drawObjects[i].target == null)
            {
                m_drawObjects.RemoveAt(i);
                return;
            }
        }
    }

    void SetLight()
    {
        //设置默认值
        selfTrans.localPosition   = Vector3.zero;
        selfTrans.localRotation   = Quaternion.identity;
        selfTrans.parent.rotation = Quaternion.Euler(DEFAULTANGLE, 0, 0);

        //根据场景平行光,设置阴影的方向
        GameObject MapScene = GameObject.Find("MapScene");

        if (MapScene == null)
        {
            return;
        }
        Light[] lights     = MapScene.GetComponentsInChildren <Light>();
        int     lightCount = 0;

        for (int i = 0; i < lights.Length; ++i)
        {
            if (lights[i].gameObject.name.Equals(LIGHTNAME))
            {
                lightCount++;
                m_sceneLight = lights[i].gameObject;
            }
        }

        if (lightCount > 1)
        {
            Debuger.LogError("场景中有多个角色平行光");
        }

        //设置灯光方向
        if (m_sceneLight != null)
        {
            m_sceneLight.AddComponentIfNoExist <TargetDirection>();
        }
    }

    void ShowObject(Transform trans, bool isShow)
    {
#if USE_DRAW_POOL
        //关闭影子
        for (int i = 0; i < m_drawObjects.Count; i++)
        {
            if (m_drawObjects[i].target == m_role.m_go.transform)
            {
                m_drawObjects[i].enabled = isShow;
            }
        }
#else
        if (isShow)
        {
            AddDrawTarget(trans);
        }
        else
        {
            RemoveDrawTarget(trans);
        }
#endif
    }

    void AddDrawTarget(Transform trans)
    {
        //如果已经添加过了,就不要再添加了
        for (int i = 0; i < m_drawObjects.Count; i++)
        {
            if (m_drawObjects[i].target == trans)
            {
                m_drawObjects[i].enabled = true;
                m_drawObjects[i].target  = trans;
                Debuger.LogError("重复添加阴影");
                return;
            }
        }

        DrawTargetObject drawTarget = null;

#if USE_DRAW_POOL
        for (int i = 0; i < m_drawObjects.Count; i++)
        {
            if (s_instce.m_drawObjects[i].target == null)
            {
                drawTarget = m_drawObjects[i];
                m_drawObjects[i].enabled = true;
                break;
            }
        }
#endif

        //重新创建一个新的
        if (drawTarget == null)
        {
            drawTarget = gameObject.AddComponent <DrawTargetObject>();
            drawTarget.followTarget       = false;
            drawTarget.shadowShader       = m_defaultDrawObject.shadowShader;
            drawTarget.replacementShaders = m_defaultDrawObject.replacementShaders;
            drawTarget.layerMask          = m_defaultDrawObject.layerMask;
            m_drawObjects.Add(drawTarget);
        }
        drawTarget.target = trans;
    }

    void SetFollow(Transform trans)
    {
        m_followTrans = trans;
    }

    void RemoveDrawTarget(Transform trans)
    {
        for (int i = m_drawObjects.Count - 1; i >= 0; i--)
        {
            if (m_drawObjects[i].target == trans)
            {
#if USE_DRAW_POOL
                s_instance.m_drawObjects[i].target  = null;
                s_instance.m_drawObjects[i].enabled = false;
                s_instance.m_drawObjects[i].Clear();
#else
                Object.Destroy(m_drawObjects[i]);
                m_drawObjects.RemoveAt(i);
#endif
            }
        }
    }
}