RhinoFreak 发表于 2022-8-23 15:12

【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]
查看完整版本: 【Unity】URP源码分析(管线篇)