using UnityEngine; namespace Es.WaveformProvider.Sample { [ExecuteInEditMode] public class Reflect : MonoBehaviour { [SerializeField] private Camera reflectCamera; private Renderer renderer; private Material sharedMaterial; private readonly int ShaderPropertyReflectTex = Shader.PropertyToID("_RefTex"); private void Start() { renderer = GetComponent(); sharedMaterial = renderer.sharedMaterial; reflectCamera.targetTexture = new RenderTexture(Screen.width, Screen.height, 16); sharedMaterial.SetTexture(ShaderPropertyReflectTex, reflectCamera.targetTexture); } private void OnWillRenderObject() { Camera current = Camera.current; if (current == reflectCamera) { Matrix4x4 worldToCameraMatrix = current.worldToCameraMatrix; Matrix4x4 value = GL.GetGPUProjectionMatrix(current.projectionMatrix, renderIntoTexture: false) * worldToCameraMatrix; Matrix4x4 localToWorldMatrix = renderer.localToWorldMatrix; sharedMaterial.SetMatrix("_RefVP", value); sharedMaterial.SetMatrix("_RefW", localToWorldMatrix); if (Screen.width != reflectCamera.targetTexture.width || Screen.height != reflectCamera.targetTexture.height) { reflectCamera.targetTexture = new RenderTexture(Screen.width, Screen.height, 16); sharedMaterial.SetTexture(ShaderPropertyReflectTex, reflectCamera.targetTexture); } if (!Application.isPlaying && sharedMaterial.GetTexture(ShaderPropertyReflectTex) == null) { sharedMaterial.SetTexture(ShaderPropertyReflectTex, reflectCamera.targetTexture); } } } } }