Esempio n. 1
0
    private void OnPreRender()
    {
        for (int i = 0; i < CascadeStepNum; ++i)
        {
            if (m_shadowmaps[i] == null)
            {
                m_shadowmaps[i] = new RenderTexture(m_sceneCamera.pixelWidth, m_sceneCamera.pixelHeight, 24);
            }

            m_shadowmapCamera.targetTexture = m_shadowmaps[i];

            if (m_worldToShadowmapUVMatrixs[i] == null)
            {
                m_worldToShadowmapUVMatrixs[i] = new Matrix4x4();
            }

            CascadedShadowMapCameraParams cascadeInfo = m_shadowMapCameraParams[i];
            if (cascadeInfo == null)
            {
                return;
            }

            m_shadowmapCameraObject.transform.localPosition = cascadeInfo.cameraPosition;
            m_shadowmapCameraObject.transform.localRotation = Quaternion.identity;
            m_shadowmapCamera.nearClipPlane    = 0.05f;
            m_shadowmapCamera.farClipPlane     = 0.05f + cascadeInfo.cameraZSize;
            m_shadowmapCamera.orthographicSize = cascadeInfo.cameraOrthogonalSize;

            m_worldToShadowmapUVMatrixs[i] = ProjectionToUVMatrix * GL.GetGPUProjectionMatrix(m_shadowmapCamera.projectionMatrix, false) * m_shadowmapCamera.worldToCameraMatrix;

            m_shadowmapCamera.RenderWithShader(m_shadowmapShader, "");
        }

        //把所有的shadowmap传给GPU,所以如果Cascaded太多的话,带宽是个问题
        if (m_shadowmapArray == null)
        {
            m_shadowmapArray = TextureUtility.CreateTextureArray(m_shadowmaps.ToList <RenderTexture>(), m_sceneCamera.pixelWidth, m_sceneCamera.pixelHeight);
        }
        else
        {
            TextureUtility.UpdateTextureArray(m_shadowmapArray, m_shadowmaps.ToList <RenderTexture>());
        }

        Shader.SetGlobalTexture("_ShadowMapArray", m_shadowmapArray);
        Shader.SetGlobalMatrixArray("_WorldToShadowMapUVMatrix", m_worldToShadowmapUVMatrixs);
        Shader.SetGlobalVector("_ShadowMapParams", new Vector4(m_sceneCamera.nearClipPlane, m_sceneCamera.farClipPlane, CascadeStepNum, 0));
    }
Esempio n. 2
0
    private void UpdateShadowmapCameraParams(BoundsType boundsType)
    {
        if (boundsType == BoundsType.AABB)
        {
            for (int i = 0; i < CascadeStepNum; ++i)
            {
                List <Vector3> frustumVertex             = m_cameraFrustumList[i];
                AABBBounds     frustumBoundsOnLightSpace = GeometryUtility.GetAABBBoundsOnTargetSpace(Mainlight.transform, frustumVertex);

                CascadedShadowMapCameraParams cameraParams = new CascadedShadowMapCameraParams();
                cameraParams.cameraPosition       = new Vector3(frustumBoundsOnLightSpace.Center.x, frustumBoundsOnLightSpace.Center.y, frustumBoundsOnLightSpace.Min.z - 0.05f);
                cameraParams.cameraOrthogonalSize = Mathf.Max(frustumBoundsOnLightSpace.Extends.x, frustumBoundsOnLightSpace.Extends.y) / 2;           //todo:orthogonalSize算法需要以后好好研究一下
                cameraParams.cameraZSize          = frustumBoundsOnLightSpace.Size.z;

                m_shadowMapCameraParams.Add(cameraParams);
            }
        }
    }