void OnWillRenderObject() { //Before the object is rendered //We store per-object SSS settings in material copies on each affected renderer's SSSSS_Object script (propertiesHostMat) //We use camera events so that SSS objects could swap between the properties host and original materials when rendering the mask //This way we can avoid original materials getting instantiated if (mainScript == null) { mainScript = Object.FindObjectOfType <CP_SSSSS_Main>(); } if (mainScript != null) { if (Camera.current.name == mainScript.camName) { SubstituteMaterial(); UpdateSSS(); Camera.onPostRender -= RevertMaterial; Camera.onPostRender += RevertMaterial; } } }
// Use this for initialization void Start() { r = GetComponent <Renderer>(); parameters.Clear(); subMeshIndicies.Clear(); if (r) { var sharedMaterials = r.sharedMaterials; for (int i = 0; i < sharedMaterials.Length; ++i) { var material = sharedMaterials[i]; if (i < scatteringColorsPerSubmesh.Length && scatteringColorsPerSubmesh[i].color != Color.black && material.renderQueue != (int)UnityEngine.Rendering.RenderQueue.Transparent) { subMeshIndicies.Add(i); parameters.Add(CP_SSSSS_Main.MakeSSSParameterFromTextureAndColor(scatteringColorsPerSubmesh[i])); } else if (CP_SSSSS_Main.HasMaterialSSSParameter(material) && material.renderQueue != (int)UnityEngine.Rendering.RenderQueue.Transparent) { subMeshIndicies.Add(i); parameters.Add(CP_SSSSS_Main.MakeSSSParameterFromMaterial(material)); } } } }