Files
2026-03-04 10:03:45 +08:00

48 lines
1.6 KiB
C#

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<Renderer>();
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);
}
}
}
}
}