void Start() { m_DepthCamera = new VolumetricLightDepthCamera(); m_Subdivision = Mathf.Clamp(m_Subdivision, 0.1f, m_Range * 0.9f); if (m_VertexBased) { m_Mesh = new VLVertexRenderMesh(); } else { m_Mesh = new VLPixelRenderMesh(); } if (!CheckSupport()) { return; } m_InternalWorldLightVPID = Shader.PropertyToID("internalWorldLightVP"); m_InternalWorldLightMVID = Shader.PropertyToID("internalWorldLightMV"); m_InternalProjectionParams = Shader.PropertyToID("internalProjectionParams"); m_InternalBiasID = Shader.PropertyToID("internalBias"); m_InternalCookieID = Shader.PropertyToID("internalCookie"); m_InternalLightPosID = Shader.PropertyToID("internalWorldLightPos"); m_InternalLightColorID = Shader.PropertyToID("internalWorldLightColor"); m_DepthCamera.InitCamera(this); m_Mesh.InitMesh(this); m_Projection = m_DepthCamera.depthRenderCamera.projectionMatrix; Shader.SetGlobalMatrix(m_InternalWorldLightVPID, m_Projection); Shader.SetGlobalMatrix("internalProjectionInv", m_Projection.inverse); m_WorldToCam = m_DepthCamera.depthRenderCamera.worldToCameraMatrix; Shader.SetGlobalMatrix(m_InternalWorldLightMVID, m_WorldToCam); SetLightProjectionParams(); Shader.SetGlobalFloat(m_InternalBiasID, m_ShadowBias); Shader.SetGlobalColor(m_InternalLightColorID, new Color(m_Color.r * m_Intensity, m_Color.g * m_Intensity, m_Color.b * m_Intensity, m_Color.a)); if (m_Cookie && !m_VertexBased) { Shader.EnableKeyword("USE_COOKIE"); Shader.SetGlobalTexture(m_InternalCookieID, m_Cookie); } else { Shader.DisableKeyword("USE_COOKIE"); } ResetQuality(m_Quality == Quality.Low, m_Quality == Quality.Middle, m_Quality == Quality.High); m_Mesh.RefreshMesh(m_Color, m_Intensity, m_Range, m_Subdivision, transform.worldToLocalMatrix * m_DepthCamera.depthRenderCamera.cameraToWorldMatrix * m_DepthCamera.depthRenderCamera.projectionMatrix.inverse); m_IsInitialized = true; }
void OnDestroy() { if (m_DepthCamera != null) { m_DepthCamera.Destroy(); } m_DepthCamera = null; if (m_Mesh != null) { m_Mesh.Destroy(); } m_Mesh = null; }