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)); }
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); } } }