Files
XRLib/Assets/Plugins/Easy performant outline/Scripts/RenderTargetUtility.cs
2025-08-11 18:30:13 +09:00

160 lines
6.0 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
namespace EPOOutline
{
public static class XRUtility
{
public static bool IsXRActive =>
UnityEngine.XR.XRSettings.enabled &&
UnityEngine.XR.XRSettings.isDeviceActive;
public static RenderTextureDescriptor VRRenderTextureDescriptor => UnityEngine.XR.XRSettings.eyeTextureDesc;
public static bool IsUsingVR(OutlineParameters parameters)
{
return IsXRActive &&
!parameters.IsEditorCamera &&
parameters.EyeMask != StereoTargetEyeMask.None;
}
}
public static class RenderTargetUtility
{
private static RenderTextureFormat? hdrFormat = null;
public static RenderTextureFormat GetRTFormat(bool useHDR) =>
useHDR ? GetHDRTextureFormat() : RenderTextureFormat.ARGB32;
public static int GetDepthSliceForEye(StereoTargetEyeMask mask)
{
switch (mask)
{
case StereoTargetEyeMask.Both:
return -1;
case StereoTargetEyeMask.None:
case StereoTargetEyeMask.Left:
return 0;
case StereoTargetEyeMask.Right:
return 1;
default:
throw new ArgumentException("Unknown mode");
}
}
public struct RenderTextureInfo
{
public readonly RenderTextureDescriptor Descriptor;
public RenderTextureInfo(RenderTextureDescriptor descriptor)
{
Descriptor = descriptor;
}
}
public static RenderTargetIdentifier ComposeTarget(OutlineParameters parameters, RenderTargetIdentifier target)
{
return new RenderTargetIdentifier(target, 0, CubemapFace.Unknown, GetDepthSliceForEye(parameters.EyeMask));
}
public static RenderTextureInfo GetTargetInfo(OutlineParameters parameters, int width, int height)
{
var rtFormat = GetRTFormat(parameters.UseHDR);
if (XRUtility.IsUsingVR(parameters))
{
var descriptor = UnityEngine.XR.XRSettings.eyeTextureDesc;
descriptor.colorFormat = rtFormat;
descriptor.width = width;
descriptor.height = height;
descriptor.depthBufferBits = 0;
descriptor.msaaSamples = Mathf.Max(parameters.Antialiasing, 1);
var eyesCount = parameters.EyeMask == StereoTargetEyeMask.Both ? VRTextureUsage.TwoEyes : VRTextureUsage.OneEye;
descriptor.vrUsage = eyesCount;
return new RenderTextureInfo(descriptor);
}
else
{
var descriptor = new RenderTextureDescriptor(width, height, rtFormat, 0);
descriptor.dimension = TextureDimension.Tex2D;
descriptor.msaaSamples = Mathf.Max(parameters.Antialiasing, 1);
return new RenderTextureInfo(descriptor);
}
}
public static RTHandle GetRT(OutlineParameters parameters, int width, int height, string name)
{
var info = GetTargetInfo(parameters, width, height);
#if UNITY_6000_0_OR_NEWER
var result = OutlineEffect.HandleSystem.Alloc(width, height,
colorFormat: info.Descriptor.graphicsFormat,
wrapMode: TextureWrapMode.Clamp,
slices: info.Descriptor.volumeDepth,
filterMode: FilterMode.Bilinear,
dimension: info.Descriptor.dimension,
enableRandomWrite: info.Descriptor.enableRandomWrite,
useMipMap: info.Descriptor.useMipMap,
autoGenerateMips: info.Descriptor.autoGenerateMips,
msaaSamples: (MSAASamples)info.Descriptor.msaaSamples,
bindTextureMS: info.Descriptor.bindMS,
useDynamicScale: info.Descriptor.useDynamicScale,
useDynamicScaleExplicit: info.Descriptor.useDynamicScaleExplicit,
memoryless: info.Descriptor.memoryless,
vrUsage: info.Descriptor.vrUsage,
name: name);
#else
var result = OutlineEffect.HandleSystem.Alloc(width, height,
info.Descriptor.volumeDepth,
0,
info.Descriptor.graphicsFormat,
FilterMode.Bilinear,
TextureWrapMode.Clamp,
info.Descriptor.dimension,
info.Descriptor.enableRandomWrite,
info.Descriptor.useMipMap,
info.Descriptor.autoGenerateMips,
false,
1,
0.0f,
(MSAASamples)info.Descriptor.msaaSamples,
info.Descriptor.bindMS,
info.Descriptor.useDynamicScale,
info.Descriptor.memoryless,
#if UNITY_2022_1_OR_NEWER
info.Descriptor.vrUsage,
#endif
name);
#endif
return result;
}
public static RenderTextureFormat GetHDRTextureFormat()
{
if (hdrFormat.HasValue)
return hdrFormat.Value;
if (SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf))
hdrFormat = RenderTextureFormat.ARGBHalf;
else if (SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBFloat))
hdrFormat = RenderTextureFormat.ARGBFloat;
else if (SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGB64))
hdrFormat = RenderTextureFormat.ARGB64;
else
hdrFormat = RenderTextureFormat.ARGB32;
return hdrFormat.Value;
}
public static GraphicsFormat GetHDRGraphicsFormat()
{
return GraphicsFormatUtility.GetGraphicsFormat(GetHDRTextureFormat(), RenderTextureReadWrite.Default);
}
}
}