public void UpdateShadows() { m_projectorInterface.GetClipPlanes(ref m_clipPlanes, null); for (var i = 0; i < m_shadowCasterCount; ++i) { m_prevShadowCasters[i] = m_shadowCasters[i]; } for (var i = 0; i < m_shadowCasterCount; ++i) { var caster = m_shadowCasters[i]; if ((m_shadowCasterMask.value & (1 << caster.gameObject.layer)) == 0) { RemoveCaster(m_shadowCasters[i]); --i; } if (!IsInProjectionVolume(caster)) { RemoveCaster(caster); --i; } } var casters = LightProjectorShadowCaster.GetAllCasters(); for (var i = 0; i < casters.Count && m_shadowCasterCount < m_maxShadowNum; ++i) { var caster = casters[i]; if ((m_shadowCasterMask.value & (1 << caster.gameObject.layer)) == 0) { continue; } var alreadyExist = false; for (var j = 0; j < m_prevShadowCasterCount; ++j) { if (caster == m_prevShadowCasters[j]) { alreadyExist = true; break; } } if ((!alreadyExist) && IsInProjectionVolume(caster)) { AddCaster(caster); } } Vector3 lightPos; if (m_projectorInterface.isOrthographic) { lightPos = m_projectorInterface.direction; } else { lightPos = m_projectorInterface.position; } for (var i = 0; i < m_shadowCasterCount; ++i) { Matrix4x4 mat; if (m_projectorInterface.isOrthographic) { mat = m_shadowCasters[i].GetOrthoProjectionMatrix(lightPos); } else { mat = m_shadowCasters[i].GetProjectionMatrix(lightPos); } m_material.SetMatrix(s_shadowProjectionMatrixPropertyIDs[i], mat); m_material.SetTexture(s_shadowTexturePropertyIDs[i], m_shadowCasters[i].shadowTexture); } if (m_prevShadowCasterCount != m_shadowCasterCount) { m_material.DisableKeyword(s_shadowNumKeyword[m_prevShadowCasterCount]); m_material.EnableKeyword(s_shadowNumKeyword[m_shadowCasterCount]); m_prevShadowCasterCount = m_shadowCasterCount; } }