////////////////////////////////////////////////////// // MK Glow RenderContext // // // // Created by Michael Kremmel // // www.michaelkremmel.de // // Copyright © 2021 All rights reserved. // ////////////////////////////////////////////////////// using UnityEngine; namespace MK.Glow { #if UNITY_2018_3_OR_NEWER #if ENABLE_VR using XRSettings = UnityEngine.XR.XRSettings; #endif #endif internal sealed class RenderContext : IDimension { #if UNITY_2017_1_OR_NEWER private RenderTextureDescriptor _descriptor; public RenderTextureDescriptor descriptor { get{ return _descriptor; } } public RenderDimension renderDimension { get{ return new RenderDimension(_descriptor.width, _descriptor.height); } } public bool enableRandomWrite { get{ return _descriptor.enableRandomWrite; } } #else private RenderDimension _descriptor; private bool _enableRandomWrite; public bool enableRandomWrite { get{ return _enableRandomWrite; } } public RenderDimension descriptor { get{ return _descriptor; } } public RenderDimension renderDimension { get{ return _descriptor; } } #endif public int width { get{ return _descriptor.width; } } public int height { get{ return _descriptor.height; } } /// /// Create the rendercontext based on XR settings /// internal RenderContext() { #if UNITY_2018_3_OR_NEWER #if ENABLE_VR _descriptor = XRSettings.enabled ? XRSettings.eyeTextureDesc : new RenderTextureDescriptor(); #else _descriptor = new RenderTextureDescriptor(); #endif _descriptor.msaaSamples = 1; _descriptor.useMipMap = false; _descriptor.autoGenerateMips = false; _descriptor.shadowSamplingMode = UnityEngine.Rendering.ShadowSamplingMode.None; #elif UNITY_2017_1_OR_NEWER _descriptor = new RenderTextureDescriptor(); _descriptor.msaaSamples = 1; _descriptor.useMipMap = false; _descriptor.autoGenerateMips = false; #else _descriptor = new RenderDimension(0, 0); #endif #if UNITY_2019_2_OR_NEWER _descriptor.mipCount = 1; #endif } /// /// Doublewide the dimension if single pass stereo is enabled /// /// internal void SinglePassStereoAdjustWidth(bool stereoEnabled) { _descriptor.width = stereoEnabled && PipelineProperties.singlePassStereoDoubleWideEnabled ? _descriptor.width * 2 : _descriptor.width; } /// /// Update a render context based on rendering settings including xr /// /// /// /// /// /// internal void UpdateRenderContext(ICameraData cameraData, RenderTextureFormat format, int depthBufferBits, bool enableRandomWrite, RenderDimension dimension) { if(cameraData.GetOverwriteDescriptor()) { _descriptor.dimension = cameraData.GetOverwriteDimension(); #if ENABLE_VR _descriptor.vrUsage = cameraData.GetStereoEnabled() ? XRSettings.eyeTextureDesc.vrUsage : VRTextureUsage.None; #else _descriptor.vrUsage = VRTextureUsage.None; #endif _descriptor.volumeDepth = cameraData.GetOverwriteVolumeDepth(); } else { #if UNITY_2018_3_OR_NEWER #if ENABLE_VR _descriptor.dimension = cameraData.GetStereoEnabled() && !cameraData.GetTargetTexture() ? XRSettings.eyeTextureDesc.dimension : UnityEngine.Rendering.TextureDimension.Tex2D; _descriptor.vrUsage = cameraData.GetStereoEnabled() && !cameraData.GetTargetTexture() ? XRSettings.eyeTextureDesc.vrUsage : VRTextureUsage.None; _descriptor.volumeDepth = cameraData.GetStereoEnabled() && !cameraData.GetTargetTexture() ? XRSettings.eyeTextureDesc.volumeDepth : 1; #else _descriptor.dimension = UnityEngine.Rendering.TextureDimension.Tex2D; _descriptor.vrUsage = VRTextureUsage.None; _descriptor.volumeDepth = 1; #endif #elif UNITY_2017_1_OR_NEWER _descriptor.dimension = UnityEngine.Rendering.TextureDimension.Tex2D; _descriptor.vrUsage = VRTextureUsage.None; _descriptor.volumeDepth = 1; #endif } #if UNITY_2017_1_OR_NEWER _descriptor.colorFormat = format; _descriptor.depthBufferBits = depthBufferBits; _descriptor.enableRandomWrite = enableRandomWrite; _descriptor.width = dimension.width; _descriptor.height = dimension.height; _descriptor.memoryless = RenderTextureMemoryless.None; _descriptor.sRGB = RenderTextureReadWrite.Default != RenderTextureReadWrite.Linear; #else _enableRandomWrite = enableRandomWrite; _descriptor.width = dimension.width; _descriptor.height = dimension.height; #endif _descriptor.depthBufferBits = 16; } } }