48 lines
1.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|