{"id":2447,"date":"2020-09-14T20:05:31","date_gmt":"2020-09-14T12:05:31","guid":{"rendered":"http:\/\/blog.coolcoding.cn\/?p=2447"},"modified":"2020-09-17T00:09:13","modified_gmt":"2020-09-16T16:09:13","slug":"unityurp-universalrenderpipelinecore-cs","status":"publish","type":"post","link":"https:\/\/blog.coolcoding.cn\/?p=2447","title":{"rendered":"[Unity]URP-UniversalRenderPipelineCore.cs"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>using System;\nusing System.Collections.Generic;\nusing Unity.Collections;\nusing UnityEngine.Scripting.APIUpdating;\nusing UnityEngine.Experimental.GlobalIllumination;\nusing Lightmapping = UnityEngine.Experimental.GlobalIllumination.Lightmapping;\n\nnamespace UnityEngine.Rendering.Universal\n{\n    public enum MixedLightingSetup\n    {\n        None,\n        ShadowMask,\n        Subtractive,\n    };\n\n    public struct RenderingData\n    {\n        public CullingResults cullResults;\n        public CameraData cameraData;\n        public LightData lightData;\n        public ShadowData shadowData;\n        public PostProcessingData postProcessingData;\n        public bool supportsDynamicBatching;\n        public PerObjectData perObjectData;\n        [Obsolete(\"killAlphaInFinalBlit is deprecated in the Universal Render Pipeline since it is no longer needed on any supported platform.\")]\n        public bool killAlphaInFinalBlit;\n\n        \/\/\/ &lt;summary>\n        \/\/\/ True if post-processing effect is enabled while rendering the camera stack.\n        \/\/\/ &lt;\/summary>\n        public bool postProcessingEnabled;\n        internal bool resolveFinalTarget;\n    }\n\n    public struct LightData\n    {\n        public int mainLightIndex;\n        public int additionalLightsCount;\n        public int maxPerObjectAdditionalLightsCount;\n        public NativeArray&lt;VisibleLight> visibleLights;\n        public bool shadeAdditionalLightsPerVertex;\n        public bool supportsMixedLighting;\n    }\n\n    public struct CameraData\n    {\n        public Camera camera;\n        public CameraRenderType renderType;\n        public RenderTexture targetTexture;\n        public RenderTextureDescriptor cameraTargetDescriptor;\n        \/\/ Internal camera data as we are not yet sure how to expose View in stereo context.\n        \/\/ We might change this API soon.\n        internal Matrix4x4 viewMatrix;\n        internal Matrix4x4 projectionMatrix;\n        internal Rect pixelRect;\n        internal int pixelWidth;\n        internal int pixelHeight;\n        internal float aspectRatio;\n        public float renderScale;\n        public bool clearDepth;\n        public bool isSceneViewCamera;\n        public bool isDefaultViewport;\n        public bool isHdrEnabled;\n        public bool requiresDepthTexture;\n        public bool requiresOpaqueTexture;\n\n        public SortingCriteria defaultOpaqueSortFlags;\n\n        public bool isStereoEnabled;\n        internal int numberOfXRPasses;\n        internal bool isXRMultipass;\n\n        public float maxShadowDistance;\n        public bool postProcessEnabled;\n\n        public IEnumerator&lt;Action&lt;RenderTargetIdentifier, CommandBuffer>> captureActions;\n\n        public LayerMask volumeLayerMask;\n        public Transform volumeTrigger;\n\n        public bool isStopNaNEnabled;\n        public bool isDitheringEnabled;\n        public AntialiasingMode antialiasing;\n        public AntialiasingQuality antialiasingQuality;\n        internal ScriptableRenderer renderer;\n    }\n\n    public struct ShadowData\n    {\n        public bool supportsMainLightShadows;\n        public bool requiresScreenSpaceShadowResolve;\n        public int mainLightShadowmapWidth;\n        public int mainLightShadowmapHeight;\n        public int mainLightShadowCascadesCount;\n        public Vector3 mainLightShadowCascadesSplit;\n        public bool supportsAdditionalLightShadows;\n        public int additionalLightsShadowmapWidth;\n        public int additionalLightsShadowmapHeight;\n        public bool supportsSoftShadows;\n        public int shadowmapDepthBufferBits;\n        public List&lt;Vector4> bias;\n    }\n\n    public struct PostProcessingData\n    {\n        public ColorGradingMode gradingMode;\n        public int lutSize;\n    }\n\n    class CameraDataComparer : IComparer&lt;Camera>\n    {\n        public int Compare(Camera lhs, Camera rhs)\n        {\n            return (int)lhs.depth - (int)rhs.depth;\n        }\n    }\n\n    public sealed partial class UniversalRenderPipeline\n    {\n        static List&lt;Vector4> m_ShadowBiasData = new List&lt;Vector4>();\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Checks if a camera is a game camera.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"camera\">Camera to check state from.&lt;\/param>\n        \/\/\/ &lt;returns>true if given camera is a game camera, false otherwise.&lt;\/returns>\n        public static bool IsGameCamera(Camera camera)\n        {\n            if (camera == null)\n                throw new ArgumentNullException(\"camera\");\n\n            return camera.cameraType == CameraType.Game || camera.cameraType == CameraType.VR;\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Checks if a camera is rendering in stereo mode.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"camera\">Camera to check state from.&lt;\/param>\n        \/\/\/ &lt;returns>Returns true if the given camera is rendering in stereo mode, false otherwise.&lt;\/returns>\n        public static bool IsStereoEnabled(Camera camera)\n        {\n            if (camera == null)\n                throw new ArgumentNullException(\"camera\");\n\n            bool isGameCamera = IsGameCamera(camera);\n            bool isCompatWithXRDimension = true;\n            return XRGraphics.enabled &amp;&amp; isGameCamera &amp;&amp; (camera.stereoTargetEye == StereoTargetEyeMask.Both) &amp;&amp; isCompatWithXRDimension;\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Returns the current render pipeline asset for the current quality setting.\n        \/\/\/ If no render pipeline asset is assigned in QualitySettings, then returns the one assigned in GraphicsSettings.\n        \/\/\/ &lt;\/summary>\n        public static UniversalRenderPipelineAsset asset\n        {\n            get => GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset;\n        }\n\n        \/\/\/ &lt;summary>\n        \/\/\/ Checks if a camera is rendering in MultiPass stereo mode.\n        \/\/\/ &lt;\/summary>\n        \/\/\/ &lt;param name=\"camera\">Camera to check state from.&lt;\/param>\n        \/\/\/ &lt;returns>Returns true if the given camera is rendering in multi pass stereo mode, false otherwise.&lt;\/returns>\n        static bool IsMultiPassStereoEnabled(Camera camera)\n        {\n            if (camera == null)\n                throw new ArgumentNullException(\"camera\");\n\n            return false;\n        }\n\n        void SortCameras(Camera[] cameras)\n        {\n            if (cameras.Length &lt;= 1)\n                return;\n            Array.Sort(cameras, new CameraDataComparer());\n        }\n\n        static RenderTextureDescriptor CreateRenderTextureDescriptor(Camera camera, float renderScale,\n            bool isStereoEnabled, bool isHdrEnabled, int msaaSamples, bool needsAlpha)\n        {\n            RenderTextureDescriptor desc;\n            RenderTextureFormat renderTextureFormatDefault = RenderTextureFormat.Default;\n\n            \/\/ NB: There's a weird case about XR and render texture\n            \/\/ In test framework currently we render stereo tests to target texture\n            \/\/ The descriptor in that case needs to be initialized from XR eyeTexture not render texture\n            \/\/ Otherwise current tests will fail. Check: Do we need to update the test images instead?\n            if (isStereoEnabled)\n            {\n                desc = XRGraphics.eyeTextureDesc;\n                renderTextureFormatDefault = desc.colorFormat;\n            }\n            else if (camera.targetTexture == null)\n            {\n                desc = new RenderTextureDescriptor(camera.pixelWidth, camera.pixelHeight);\n                desc.width = (int)((float)desc.width * renderScale);\n                desc.height = (int)((float)desc.height * renderScale);\n            }\n            else\n            {\n                desc = camera.targetTexture.descriptor;\n            }\n\n            if (camera.targetTexture != null)\n            {\n                desc.colorFormat = camera.targetTexture.descriptor.colorFormat;\n                desc.depthBufferBits = camera.targetTexture.descriptor.depthBufferBits;\n                desc.msaaSamples = camera.targetTexture.descriptor.msaaSamples;\n                desc.sRGB = camera.targetTexture.descriptor.sRGB;\n            }\n            else\n            {\n                bool use32BitHDR = !needsAlpha &amp;&amp; RenderingUtils.SupportsRenderTextureFormat(RenderTextureFormat.RGB111110Float);\n                RenderTextureFormat hdrFormat = (use32BitHDR) ? RenderTextureFormat.RGB111110Float : RenderTextureFormat.DefaultHDR;\n            \n                desc.colorFormat = isHdrEnabled ? hdrFormat : renderTextureFormatDefault;\n                desc.depthBufferBits = 32;\n                desc.msaaSamples = msaaSamples;\n                desc.sRGB = (QualitySettings.activeColorSpace == ColorSpace.Linear);\n            }\n\n            desc.enableRandomWrite = false;\n            desc.bindMS = false;\n            desc.useDynamicScale = camera.allowDynamicResolution;\n            return desc;\n        }\n\n        static Lightmapping.RequestLightsDelegate lightsDelegate = (Light[] requests, NativeArray&lt;LightDataGI> lightsOutput) =>\n        {\n            \/\/ Editor only.\n            LightDataGI lightData = new LightDataGI();\n\n            for (int i = 0; i &lt; requests.Length; i++)\n            {\n                Light light = requests[i];\n                lightData.InitNoBake(light.GetInstanceID());\n                lightsOutput[i] = lightData;\n            }\n            Debug.LogWarning(\"Realtime GI is not supported in Universal Pipeline.\");\n        };\n    }\n}\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>        protected override void UniversalRenderPipeline::Render(ScriptableRenderContext renderContext, Camera[] cameras)\n        {\n            BeginFrameRendering(renderContext, cameras);\n            GraphicsSettings.lightsUseLinearIntensity = (QualitySettings.activeColorSpace == ColorSpace.Linear);\n            GraphicsSettings.useScriptableRenderPipelineBatching = asset.useSRPBatcher;\n            SetupPerFrameShaderConstants();\n\n            SortCameras(cameras);\n            for (int i = 0; i &lt; cameras.Length; ++i)\n            {\n                var camera = cameras[i];\n                if (IsGameCamera(camera))\n                {\n                    RenderCameraStack(renderContext, camera);\n                }\n                else\n                {\n                    BeginCameraRendering(renderContext, camera);\n                    UpdateVolumeFramework(camera, null);\n                    RenderSingleCamera(renderContext, camera);\n                    EndCameraRendering(renderContext, camera);\n                }\n            }\n\n            EndFrameRendering(renderContext, cameras);\n        }\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/2447"}],"collection":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2447"}],"version-history":[{"count":2,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/2447\/revisions"}],"predecessor-version":[{"id":2449,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=\/wp\/v2\/posts\/2447\/revisions\/2449"}],"wp:attachment":[{"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.coolcoding.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}