生活随笔
收集整理的這篇文章主要介紹了
unity渲染管线及升级URP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
unity渲染管線及升級URP
- 一,unity渲染管線簡介
- 二,通用渲染管線URP
- 三,shader升級URP
- 1,Builtin RP和URP中內置Shader 的對應
- 2,總體結構
- 3,include
- 4,光照模式LightMode
- 5,變體Variants
- 6,預定義宏
- 7,輔助函數
- 變換函數
- 通用輔助函數
- 向前渲染函數
- 屏幕空間
- 頂點光照
- 深度
- 其他
- 7,內置變量
- 8,后處理
- 參考資料
- 22.5.31 發現這篇只能查找參考用,實際改urp看了用處不大,urp管線下pbrshader流程看新寫的URP實現PBR shader吧
一,unity渲染管線簡介
Unity引擎的渲染管線主要分為"渲染核心庫"與"渲染策略"兩個部分, “渲染核心庫”是Unity把基于OpenGL/DirectX把渲染相關的接口函數封裝成API,這部分Unity引擎寫好后作為核心的API渲染庫。”渲染策略”指的是Unity引擎繪制整個游戲場景的時候,如何處理多相機,多光源,陰影投射,物體繪制,霧,自發光等。這個就叫做渲染策略,渲染管線基于一種渲染策略,調用渲染核心庫中的API,把整個游戲場景繪制出來。
渲染管線通過執行 剔除、渲染、后處理 來獲取場景的內容,并將這些內容顯示在屏幕上。不同的渲染管線具有不同的功能和性能特征,并且適用于不同的游戲、應用程序和平臺。
- unity提供三種渲染管線,內置渲染管線、通用渲染管線(URP)和高清渲染管線(HDRP),也可以通過unity的可編程渲染管線(Scriptable Render Pipeline,SRP) API 來完全自定義渲染管線。
- 內置渲染管線是unity默認的,自定義選項有限,是向前渲染(支持任意多光源,每個光照各走一遍pass性能差)。(可以用CommandBuffer和回調進行騷操作,版穩定性不好死板)
- URP(Universal Render Pipeline)「前身LWRP–輕量級渲染管線」是用SRP寫的非侵入式輕量級自定義渲染管線,專注性能,比如只支持幾個光源但能在同一個pass計算;除了有特殊需求選它就對了。
- HDRP可以做更多復雜算法,可以在高端平臺上(PC主機等)輸出高保真圖形,支持全局光照、光線跟蹤、子面散射等,但想得到好效果需要大量貼圖,人力預算up!「因為這次主要學習URP,HDRP這里就簡單了解下。也有人說HDRP太復雜了,不如直接用ue。」
- 其主要區別在于渲染策略,不同的渲染策略對應的shader不一樣,之前學習的shader寫法都是針對向前渲染的,如果切換成URP則shader包需要重新開發。可編程渲染管線shader語法結構還是shader lab,開發語言使用HLSL,有的也支持shader graphic。
二,通用渲染管線URP
三,shader升級URP
1,Builtin RP和URP中內置Shader 的對應
2,總體結構
在SubShader的Tags中添加"RenderPipeline" = “UniversalPipeline"表示該SubShader是給URP用的「HDRP設置為"HDRenderPipeline”」并使用HLSL的宏替代CG:
Built-inURP
| CGPROGRAM、HLSLPROGRAM | HLSLPROGRAM |
| ENDCG、ENDHLSL | ENDHLSL |
| CGINCLUDE、HLSLINCLUDE | HLSLINCLUDE |
- HLSL是URP的首選語言,但URP也支持CG語言,因此CGPROGRAM等也能用,就是和SRP Batcher 不兼容。
在Properties中聲明的屬性需要再在HLSL 代碼中用CBUFFER聲明(為了SRP Batcher):
TEXTURE2D(_BaseMap);
SAMPLER(sampler_BaseMap);CBUFFER_START(UnityPerMaterial)half4 _BaseColor;float4 _BaseMap_ST;
CBUFFER_END
fixed都不支持了,改為half或者float。
3,include
\Built-inURP
| Core | Unity.cginc | Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl |
| Light | AutoLight.cginc | Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl |
| Shadows | AutoLight.cginc | Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl |
| Surface shaders | Lighting.cginc | URP內沒有,可以參考該github項目 |
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
- URP其他常用include:SpaceTransforms.hlsl、ShaderVariablesFunctions.hlsl、Common.hlsl、Input.hlsl、Color.hlsl、DeclareDepthTexture.hlsl、DeclareOpaqueTextue.hlsl
- Core.hlsl可以直接引用,UnityInput.hlsl、UnityInstancing.hlsl、SpaceTransforms.hlsl等需要帶上前綴,防止重定義。
4,光照模式LightMode
Built-inURP
| ForwardBase | UniversalForward |
| ForwardAdd | 移除,開啟關鍵字_ADDITIONAL_LIGHTS解決 |
| Deferred 以及相關 | URP12.0支持 |
| Vertex and related | 移除 |
| ShadowCaster | ShadowCaster |
| MotionVectors | 暫不支持 |
- URP新增的:DepthOnly、Meta(用于烘焙光照貼圖)、Universal2D(用于2D的前向渲染)、UniversalGBuffer(延遲渲染用)、UniversalForwardOnly(延遲渲染中表示該pass用向前渲染)。
5,變體Variants
- 類似內置管線用multi_compile_fwdbase編譯ForwardBasePass;URP涉及批處理的變體,可以用#pragma multi_compile添加關鍵字設置:
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile _ _SHADOWS_SOFT
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE
6,預定義宏
輔助宏
Built-inURP
| UNITY_PROJ_COORD(a) | 移除,改用 a.xy/a.w |
| UNITY_INITIALIZE_OUTPUT(type, name) | ZERO_INITIALIZE(type, name) |
陰影貼圖
參考Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl
Built-inURP
| UNITY_DECLARE_SHADOWMAP(tex) | TEXTURE2D_SHADOW_PARAM(textureName, samplerName) |
| UNITY_SAMPLE_SHADOW(tex, uv) | SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord3) |
| UNITY_SAMPLE_SHADOW_PROJ(tex, uv) | SAMPLE_TEXTURE2D_SHADOW(textureName, samplerName, coord4.xyz/coord4.w) |
| UNITY_SHADOW_COORDS(x) | float4 shadowCoord : TEXCOORD##x |
| TRANSFER_SHADOW(a) | a.shadowCoord = TransformWorldToShadowCoord(worldSpacePosition) |
| SHADOWS_SCREEN | 移除了 |
紋理采樣器聲明
Built-inURP
| UNITY_DECLARE_TEX2D(name) | TEXTURE2D(textureName); SAMPLER(samplerName); |
| UNITY_DECLARE_TEX2D_NOSAMPLER(name) | TEXTURE2D(textureName); |
| UNITY_DECLARE_TEX2DARRAY(name) | TEXTURE2D_ARRAY(textureName); SAMPLER(samplerName); |
| UNITY_SAMPLE_TEX2D(name, uv) | SAMPLE_TEXTURE2D(textureName, samplerName, coord2) |
| UNITY_SAMPLE_TEX2D_SAMPLER(name, samplername, uv) | SAMPLE_TEXTURE2D(textureName, samplerName, coord2) |
| UNITY_SAMPLE_TEX2DARRAY(name, uv) | SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) |
| UNITY_SAMPLE_TEX2DARRAY_LOD(name, uv, lod) | SAMPLE_TEXTURE2D_ARRAY_LOD(textureName, samplerName, coord2, index, lod) |
| UNITY_INITIALIZE_OUTPUT(name) | ZERO_INITIALIZE(name) |
光照、霧
Built-inURP
| UNITY_LIGHTMODEL_AMBIENT | half3(unity_SHAr.w,unity_SHAr.w,unity_SHAr.w); |
| UNITY_FOG_COORDS(x) | 用float fogCoord : TEXCOORD##x; |
| UNITY_TRANSFER_FOG(o, outpos) | o.fogCoord = ComputeFogFactor(clipSpacePosition.z); |
| UNITY_APPLY_FOG(coord, col) | color = MixFog(color, i.fogCoord); |
7,輔助函數
變換函數
Built-inURP
| float4 UnityObjectToClipPos(float3 pos) | float4 TransformObjectToHClip(float3 positionOS) |
| float4 UnityWorldToClipPos(float3 pos) | float4 TransformWorldToHClip(float3 positionWS) |
| float3 UnityObjectToViewPos(float3 pos) | TransformWorldToView(TransformObjectToWorld(positionOS)) |
| float3 UnityObjectToWorldNormal(in float3 norm) | float3 TransformObjectToWorldNormal(float3 normalOS,bool doNormalize = true) |
| float3 UnityWorldSpaceViewDir (float4 v) | _WorldSpaceCameraPos.xyz - positionWS |
| float3 UnityObjectToWorldDir (float4 v) | float3 TransformObjectToWorldDir(real3 dirOS) |
通用輔助函數
Built-inURP
| float3 ObjSpaceViewDir (float4 v) | TransformWorldToObject(GetCameraPositionWS()) - objectSpacePosition; |
| float2 ParallaxOffset (half h, half height, half3 viewDir) | 移除了。可以從UnityCG.cginc復制過來 |
| fixed Luminance (fixed3 c) | real Luminance(real3 linearRgb) |
| fixed3 DecodeLightmap (fixed4 color) | real3 DecodeLightmap(real4 encodedIlluminance, real4 decodeInstructions) |
| float4 EncodeFloatRGBA (float v) | 移除了。可以從UnityCG.cginc復制過來 |
| float DecodeFloatRGBA (float4 enc) | 移除了。可以從UnityCG.cginc復制過來 |
| float2 EncodeFloatRG (float v) | 移除了。可以從UnityCG.cginc復制過來 |
| float DecodeFloatRG (float2 enc) | 移除了。可以從UnityCG.cginc復制過來 |
| float2 EncodeViewNormalStereo (float3 n) | 移除了。可以從UnityCG.cginc復制過來 |
| float3 DecodeViewNormalStereo (float4 enc4) | 移除了。可以從UnityCG.cginc復制過來 |
向前渲染函數
Built-inURP
| float3 WorldSpaceLightDir(float4 v) | _MainLightPosition.xyz - TransformObjectToWorld(objectSpacePosition) |
| float3 ObjSpaceLightDir (float4 v) | TransformWorldToObject(_MainLightPosition.xyz) - objectSpacePosition |
| float3 Shade4PointLights (…) | 用half3 VertexLighting(float3 positionWS, half3 normalWS) |
屏幕空間
Built-inURP
| float4 ComputeScreenPos (float4 clipPos) | float4 ComputeScreenPos(float4 positionCS) |
| float4 ComputeGrabScreenPos (float4 clipPos) | 移除了 |
頂點光照
Built-inURP
| float3 ShadeVertexLights (float4 vertex, float3 normal) | 用half3(unity_SHAr.w, unity_SHAg.w, unity_SHAb.w) + VertexLighting(…) |
深度
可直接使用 _CameraDepthTexture來采樣深度紋理,也可使用SampleSceneDepth(…) 和 LoadSceneDepth(…)來采樣。
Built-inURP
| LinearEyeDepth (sceneZ) | LinearEyeDepth(sceneZ, _ZBufferParams) |
| Linear01Depth (sceneZ) | Linear01Depth(sceneZ, _ZBufferParams) |
其他
Built-inURP
| shadeSH9 (float4 normal) | SampleSH(normal) |
| unity_ColorSpaceLuminance | 用Luminance() |
7,內置變量
Built-inURP
| _LightColor0 | _MainLightColor |
| _WorldSpaceLightPos0 | _MainLightPosition |
| _LightMatrix0 | 移除了。目前尚不支持 |
| unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0 | 在URP中,其他光源存儲在數組/緩沖區中(取決于平臺)。使用Light GetAdditionalLight(uint i, float3 positionWS)獲取光源信息 |
| unity_4LightAtten0 | 同上 |
| unity_LightColor | 同上) |
| unity_WorldToShadow | float4x4 _MainLightWorldToShadow[MAX_SHADOW_CASCADES + 1] 或者_AdditionalLightsWorldToShadow[MAX_VISIBLE_LIGHTS] |
使用循環所有其他燈光–GetAdditionalLight(),查詢其他燈光計數–GetAdditionalLightsCount()。
8,后處理
- URP不支持OnPreCull,OnPreRender,OnPostRender和OnRenderImage。
- 支持OnRenderObject和OnWillRenderObject,但舊管線直接用有問題,需要改寫。
- UPR函數+示例:
beginCameraRendering(ScriptableRenderContext context
, Camera camera
)
endCameraRendering(ScriptableRenderContext context
, Camera camera
)
beginFrameRendering(ScriptableRenderContext context
,Camera
[] cameras
)
endFrameRendering(ScriptableRenderContext context
,Camera
[] cameras
)
void OnEnable()
{RenderPipelineManager
.beginCameraRendering
+= MyCameraRendering
;
}void OnDisable()
{RenderPipelineManager
.beginCameraRendering
-= MyCameraRendering
;
}void MyCameraRendering(ScriptableRenderContext context
, Camera camera
)
{...if(camera
== myEffectCamera
){...UniversalRenderPipeline
.RenderSingleCamera(context
, camera
);}...
}
參考資料
unity官方文檔知乎-Unity URP/SRP 渲染管線淺入深出From Built-in to URP內置到URP官方切換文檔
總結
以上是生活随笔為你收集整理的unity渲染管线及升级URP的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。