【Unity】URP源码分析(管线篇)
(基于Unity 2021.3.8、URP 12.1.7)管线 (Pipeline)
UniversalRenderPipelineAsset.cs
属性
[*]Rendering Settings
[*]rendererDataList (渲染器数据列表)
[*]defaultRendererIndex (默认开启的渲染器索引)
[*]requireDepthTexture (是否生成_CameraDepthTexture, 在Shader中使用)
[*]requireOpaqueTexture (是否生成_CameraOpaqueTexture, 在Shader中使用)
[*]opaqueDownsampling (_CameraOpaqueTexture的降采样倍率)
[*]Quality Settings
[*]supportsHDR (是否开启HDR)
[*]MSAA (_2x、_4x、_8x) (开启2、4、8倍MSAA抗锯齿)
[*]renderScale (cameraColorTarget、cameraDepthTarget的分辨率缩放)
[*]Lighting Settings
[*]mainLightRenderingMode (PerVertex、PerPixel)
[*]mainLightShadowsSupported (是否开启主光源阴影)
[*]mainLightShadowmapResolution (主光源阴影贴图分辨率)
[*]additionalLightsRenderingMode (PerVertex、PerPixel)
[*]additionalLightsPerObjectLimit (每个物体接收的最大额外光源数量)
[*]additionalLightShadowsSupported (是否开启额外光源阴影)
[*]additionalLightsShadowmapResolution (额外光源阴影贴图分辨率)
[*]Reflection Probes Settings
[*]reflectionProbeBlending (是否开启多个反射探针混合)
[*]reflectionProbeBoxProjection (是否开启盒体投影)
[*]supportsLightLayers (是否开启光照图层)
[*]Shadows Settings
[*]shadowDistance (多少距离内生成阴影)
[*]shadowCascadeCount (CSM层数)
[*]cascade2Split、cascade3Split、cascade4Split (第一二层、二三层、三四层的划分距离)
[*]shadowDepthBias (阴影深度偏移值)
[*]shadowNormalBias (阴影法线偏移值)
[*]softShadowsSupported (是否开启软阴影)
[*]Post Processing Settings
[*]colorGradingMode (LDR、HDR)
[*]Advanced Settings
[*]useSRPBatcher (是否开启SRP合批)
[*]supportsDynamicBatching (是否开启动态合批)
方法
[*]Create (创建UniversalRenderPipelineAsset、UniversalRendererData实例)
UniversalRenderPipeline.cs
属性
[*]maxPerObjectLights (每个物体接收的最大光源数量)
[*]maxVisibleAdditionalLights (最大可见的额外光源数量, 传入到Shader中的额外光源的信息数组)
[*]globalSettings (渲染管线全局设置)
方法
[*]Render
[*]BeginContextRendering ->
[*]BeginFrameRendering ->
[*]SetupPerFrameShaderConstants (_GlossyEnvironmentColor、_GlossyEnvironmentCubeMap) ->
[*]SortCameras ->
[*]For Loop Cameras ->
[*]BeginCameraRendering
[*]UpdateVolumeFramework (更新Volume后处理参数)
[*]InitializeCameraData (初始化CameraData结构体、CreateRenderTextureDescriptor)
[*]RenderSingleCamera
[*]TryGetCullingParameters
[*]renderer.OnPreCullRenderPasses (For Loop rendererFeatures.OnCameraPreCull)
[*]context.Cull
[*]InitializeRenderingData (GetMainLightIndex、cullResults、cameraData、lightData、shadowData、postProcessingData、perObjectData)
[*]renderer.Setup
[*]renderer.Execute
[*]EndCameraRendering
[*]EndFrameRendering ->
[*]EndContextRendering
UniversalRenderPipelineCore.cs
属性
[*]asset (URP管线资产)
定义
[*]RenderingData (CullingResults、CameraData、LightData、ShadowData、PostProcessingData、PerObjectData)
[*]ShaderPropertyId (全局Shader属性的ID)
[*]ShaderKeywordStrings (全局Shader关键字)
UniversalRenderPipelineGlobalSettings.cs
属性
[*]lightLayerNames (光照图层的名称)
[*]stripDebugVariants (剔除调试用的变体)
[*]stripUnusedPostProcessingVariants (剔除不用到的后处理变体)
[*]stripUnusedVariants (剔除不用到的变体)
<hr/><hr/>渲染器 (Renderer)
ScriptableRenderer.cs
属性
[*]cameraColorTarget (相机渲染的颜色目标)
[*]cameraDepthTarget (相机渲染的深度目标)
[*]rendererFeatures (渲染特性列表)
[*]activeRenderPassQueue (渲染Pass队列)
方法
[*]ScriptableRenderer构造函数 (For Loop rendererFeatures.Create)
[*]Setup (抽象函数)
[*]Execute
[*]InternalStartRendering (For Loop activeRenderPassQueue.OnCameraSetup) ->
[*]SetShaderTimeValues (_Time、_SinTime、_CosTime、unity_DeltaTime) ->
[*]SortStable (Sort Render Pass) ->
[*]SetupLights (虚函数) ->
[*]SetPerCameraShaderVariables (_ProjectionParams、_WorldSpaceCameraPos、_ScreenParams、_ScaledScreenParams、_ZBufferParams、unity_OrthoParams、_GlobalMipBias) ->
[*]SetCameraMatrices (worldToCameraMatrix、cameraToWorldMatrix、inverseViewMatrix、inverseProjectionMatrix、inverseViewAndProjectionMatrix) ->
[*]ExecuteBlock (BeforeRendering、MainRenderingOpaque、MainRenderingTransparent、AfterRendering) ->
[*]ExecuteRenderPass (执行每个Block的渲染Pass)
[*]renderPass.Configure
[*]SetRenderPassAttachments
[*]SetRenderTarget (设置RenderPass中所指定的ColorAttachment、DepthAttachment)
[*]renderPass.Execute
[*]InternalFinishRendering (For Loop activeRenderPassQueue.OnCameraCleanup、activeRenderPassQueue.OnFinishCameraStackRendering)
[*]AddRenderPasses (For Loop rendererFeatures.AddRenderPasses)
UniversalRenderer.cs
属性
[*]renderingMode (渲染模式, Forward、Deferred)
[*]depthPrimingMode (是否开启Depth Prepass)
[*]forwardLights (前向渲染光源的处理封装)
[*]deferredLights (延迟渲染光源的处理封装)
方法
[*]UniversalRenderer构造函数 (初始化渲染Pass、_CameraColorAttachment、_CameraDepthAttachment、_CameraDepthTexture、_CameraNormalsTexture、_CameraOpaqueTexture)
[*]Setup
[*]forwardLights.ProcessLights (只对Cluster Rendering生效)
[*]AddRenderPasses (调用ScriptableRenderer.cs中的)
[*]EnqueuePass (渲染Pass添加到渲染队列)
[*]CreateCameraRenderTarget (只对Base Camera生效)
[*]ConfigureCameraTarget
[*]SetupLights (forwardLights.Setup、deferredLights.SetupLights)
ForwardLights.cs
方法
[*]Setup (_ADDITIONAL_LIGHTS_VERTEX、_ADDITIONAL_LIGHTS、_CLUSTERED_RENDERING、LIGHTMAP_SHADOW_MIXING、SHADOWS_SHADOWMASK、_MIXED_LIGHTING_SUBTRACTIVE、_REFLECTION_PROBE_BLENDING、_REFLECTION_PROBE_BOX_PROJECTION、_LIGHT_LAYERS)
[*]SetupShaderLightConstants (设置光源常量属性)
[*]SetupMainLightConstants (_MainLightPosition、_MainLightColor、_MainLightOcclusionProbes、_MainLightLayerMask)
[*]SetupAdditionalLightConstants (_AdditionalLightsPosition、_AdditionalLightsColor、_AdditionalLightsAttenuation、_AdditionalLightsSpotDir、_AdditionalLightsOcclusionProbes、_AdditionalLightsLayerMasks、_AdditionalLightsCount)
[*]SetupPerObjectLightIndices (去除主光源, 设置物体的额外光源索引)
DeferredLights.cs
属性
[*]GbufferAttachments (MRT输出的Gbuffer信息)
方法
[*]SetupLights
[*]PrecomputeTiles (只对TiledDeferredShading生效, 根据裁剪平面FrustumPlanes生成Tiles)
[*]PrecomputeLights (Precompute Punctual Light Data)
[*]SetupShaderLightConstants (设置光源常量属性)
[*]SetupMainLightConstants (_MainLightPosition、_MainLightColor、_MainLightLayerMask)
[*]SortLights (只对TiledDeferredShading生效)
[*]CullFinalLights (只对TiledDeferredShading生效)
[*]Setup (初始化GbufferAttachments、DepthAttachment)
[*]ExecuteDeferredPass
[*]SetupMatrixConstants (_ScreenToWorld)
[*]RenderStencilLights
[*]RenderStencilDirectionalLights (FullscreenMesh)
[*]RenderStencilPointLights (SphereMesh)
[*]RenderStencilSpotLights (HemisphereMesh)
[*]RenderTileLights (只对TiledDeferredShading生效)
[*]RenderFog
ScriptableRendererData.cs
属性
[*]rendererFeatures (渲染特性列表)
UniversalRendererData.cs
属性
[*]shaders (内置Shader/Utils目录下的着色器资源)
[*]opaqueLayerMask、transparentLayerMask (不透明、半透明物体的层遮罩)
[*]defaultStencilState (默认模板测试状态)
[*]renderingMode (渲染模式, Forward、Deferred)
[*]depthPrimingMode (是否开启Depth Prepass)
<hr/><hr/>渲染特性 (Renderer Feature)
ScriptableRendererFeature.cs
[*]Create (抽象函数)
[*]OnCameraPreCull (虚函数)
[*]AddRenderPasses (抽象函数)
[*]Dispose (虚函数)
RenderObjects.cs
[*]RenderObjectsPass
[*]SetDetphState (设置深度缓冲区状态)
[*]SetStencilState (设置模板测试状态)
[*]RenderObjectsSettings
[*]renderPassEvent (渲染Pass的执行时机事件)
[*]overrideMaterial (覆盖的材质)
[*]overrideMaterialPassIndex (覆盖材质的Pass索引)
[*]depthCompareFunction (深度比较方式)
[*]enableWrite (深度是否写入)
[*]filterSettings
[*]renderQueueType (渲染队列)
[*]layerMask (层遮罩)
[*]passNames (光照模式LightMode)
[*]stencilSettings
[*]stencilReference (模板引用值)
[*]stencilCompareFunction (模板比较方式)
[*]passOperation (模板值通过后的操作)
[*]failOperation (模板值失败后的操作)
[*]zFailOperation (深度比较失败后的操作)
[*]cameraSettings
[*]offset (相机位置偏移)
[*]cameraFieldOfView (视野FOV)
DecalRendererFeature.cs
[*]DecalGBufferRenderPass (执行Shader中LightMode为DecalGBufferMesh的Pass, 从GBuffer深度重建世界坐标, Shader实现可参考ShaderPassDecal.hlsl)
[*]DBufferRenderPass (执行Shader中LightMode为DBufferMesh的Pass, 将贴花固有色, 法线, 金属度、光滑度、AO、自发光渲染到DBuffer的_DBUFFER_MRT1、_DBUFFER_MRT2、_DBUFFER_MRT3, 正常渲染时采样_DBufferTexture使用DBuffer数据覆盖SurfaceData, Shader实现可参考ShaderPassDecal.hlsl、DBuffer.hlsl)
[*]DecalScreenSpaceRenderPass (执行Shader中LightMode为DecalScreenSpaceMesh的Pass, 从深度重建世界坐标、法线, Shader实现可参考ShaderPassDecal.hlsl)
ScreenSpaceAmbientOcclusion.cs
[*]ScreenSpaceAmbientOcclusionPass (生成_ScreenSpaceOcclusionTexture, Shader实现可参考SSAO.hlsl)
ScreenSpaceShadows.cs
[*]ScreenSpaceShadowsPass (根据深度、_MainLightShadowmapTexture生成_ScreenSpaceShadowmapTexture, 设置关键字_MAIN_LIGHT_SHADOWS_SCREEN)
<hr/><hr/>
渲染目标 (Render Target)
RenderTargetHandle.cs
[*]int类型id、RenderTargetIdentifier类型rtid的封装, Init时调用Shader.PropertyToID绑定id
RenderTargetBufferSystem.cs
[*]frontBuffer和backBuffer双缓冲的封装
页:
[1]