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

87 lines
1.8 KiB
C#

using UnityEngine;
using UnityEngine.Rendering;
namespace BodhiDonselaar
{
[RequireComponent(typeof(Camera))]
public class EquiCam : MonoBehaviour
{
public enum Size
{
High = 2048,
Default = 1024,
Low = 512,
Minimum = 256
}
private static Material equi;
public Size RenderResolution = Size.Default;
private RenderTexture cubemap;
private Camera cam;
private GameObject child;
private void OnEnable()
{
if (equi == null)
{
equi = new Material(Resources.Load<Shader>("EquiCam"));
}
child = new GameObject();
child.hideFlags = HideFlags.HideInHierarchy;
child.transform.SetParent(base.transform);
child.transform.localPosition = Vector3.zero;
child.transform.localEulerAngles = Vector3.zero;
cam = child.AddComponent<Camera>();
cam.CopyFrom(GetComponent<Camera>());
child.SetActive(value: false);
New();
}
private void OnDisable()
{
if (child != null)
{
Object.DestroyImmediate(child);
}
if (cubemap != null)
{
cubemap.Release();
Object.DestroyImmediate(cubemap);
}
}
private void OnRenderImage(RenderTexture src, RenderTexture des)
{
if (cubemap.width != (int)RenderResolution)
{
New();
}
cam.RenderToCubemap(cubemap);
Shader.SetGlobalFloat("FORWARD", cam.transform.eulerAngles.y * 0.01745f);
Graphics.Blit(cubemap, des, equi);
}
private void New()
{
cam.targetTexture = null;
if (cubemap != null)
{
cubemap.Release();
Object.DestroyImmediate(cubemap);
}
cubemap = new RenderTexture((int)RenderResolution, (int)RenderResolution, 0, RenderTextureFormat.ARGB32);
cubemap.antiAliasing = 1;
cubemap.filterMode = FilterMode.Bilinear;
cubemap.anisoLevel = 0;
cubemap.dimension = TextureDimension.Cube;
cubemap.autoGenerateMips = false;
cubemap.useMipMap = false;
cam.targetTexture = cubemap;
}
}
}