static Matrix4x4 ExtractSpotLightMatrix(VisibleLight vl, float forwardOffset, float spotAngle, float nearPlane, float guardAngle, float aspectRatio, out Matrix4x4 view, out Matrix4x4 proj, out Matrix4x4 deviceProj, out Matrix4x4 deviceProjYFlip, out Matrix4x4 vpinverse, out Vector4 lightDir, out ShadowSplitData splitData) { splitData = new ShadowSplitData(); splitData.cullingSphere.Set(0.0f, 0.0f, 0.0f, float.NegativeInfinity); splitData.cullingPlaneCount = 0; lightDir = vl.GetForward(); // calculate view Matrix4x4 localToWorldOffset = vl.localToWorldMatrix; CoreMatrixUtils.MatrixTimesTranslation(ref localToWorldOffset, Vector3.forward * forwardOffset); view = localToWorldOffset.inverse; view.m20 *= -1; view.m21 *= -1; view.m22 *= -1; view.m23 *= -1; // calculate projection proj = ExtractSpotLightProjectionMatrix(vl.range - forwardOffset, spotAngle, nearPlane - forwardOffset, aspectRatio, guardAngle); // and the compound (deviceProj will potentially inverse-Z) deviceProj = GL.GetGPUProjectionMatrix(proj, false); deviceProjYFlip = GL.GetGPUProjectionMatrix(proj, true); InvertPerspective(ref deviceProj, ref view, out vpinverse); return(CoreMatrixUtils.MultiplyPerspectiveMatrix(deviceProj, view)); }
static Matrix4x4 ExtractPointLightMatrix(VisibleLight vl, uint faceIdx, float nearPlane, float guardAngle, out Matrix4x4 view, out Matrix4x4 proj, out Matrix4x4 deviceProj, out Matrix4x4 vpinverse, out Vector4 lightDir, out ShadowSplitData splitData) { if (faceIdx > (uint)CubemapFace.NegativeZ) { Debug.LogError("Tried to extract cubemap face " + faceIdx + "."); } splitData = new ShadowSplitData(); splitData.cullingSphere.Set(0.0f, 0.0f, 0.0f, float.NegativeInfinity); // get lightDir lightDir = vl.GetForward(); // calculate the view matrices Vector3 lpos = vl.GetPosition(); view = kCubemapFaces[faceIdx]; Vector3 inverted_viewpos = kCubemapFaces[faceIdx].MultiplyPoint(-lpos); view.SetColumn(3, new Vector4(inverted_viewpos.x, inverted_viewpos.y, inverted_viewpos.z, 1.0f)); float nearZ = Mathf.Max(nearPlane, k_MinShadowNearPlane); proj = Matrix4x4.Perspective(90.0f + guardAngle, 1.0f, nearZ, vl.range); // and the compound (deviceProj will potentially inverse-Z) deviceProj = GL.GetGPUProjectionMatrix(proj, false); proj = GL.GetGPUProjectionMatrix(proj, true); InvertPerspective(ref deviceProj, ref view, out vpinverse); Matrix4x4 devProjView = CoreMatrixUtils.MultiplyPerspectiveMatrix(deviceProj, view); // We can avoid computing proj * view for frustum planes, if device has reversed Z we flip the culling planes as we should have computed them with proj GeometryUtility.CalculateFrustumPlanes(devProjView, s_CachedPlanes); if (SystemInfo.usesReversedZBuffer) { var tmpPlane = s_CachedPlanes[2]; s_CachedPlanes[2] = s_CachedPlanes[3]; s_CachedPlanes[3] = tmpPlane; } splitData.cullingPlaneCount = 6; for (int i = 0; i < 6; i++) { splitData.SetCullingPlane(i, s_CachedPlanes[i]); } return(devProjView); }