日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

unity渲染管线及升级URP

發布時間:2023/12/20 编程问答 96 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

  • URP相對內置管線的優點:

  • 開源。
  • 渲染路徑為單Pass Forward Rendering,DrawCall數量大大下降(支持動態燈光數量受GPU限制),陰影處理性能也好很多。(內置多光源時需要FowardAdd Pass,因此以前后用烘焙light map)
  • 拓展性好,拓展入口相當于CommandBuffer的可視化操作;新設計取代了GrabPass結構,可以提供Opaque Texture。
  • SRP Batcher,對shader的批處理,只要著色器變體一樣的都一起批處理。并將shader材質數據保存在Gpu中用時綁定,而不是每次用時從緩沖區上傳,以此減少渲染狀態設置的CPU開銷—比如glUniform4fv等設置。「變體是指shader中通過關鍵字設置的不同邏輯功能或者shader設置參數不同的,就是不同變體」
  • 與默認管線功能對比見URP與內置渲染管線功能對照表

  • URP與unity版本對應:

三,shader升級URP

1,Builtin RP和URP中內置Shader 的對應

2,總體結構

  • 在SubShader的Tags中添加"RenderPipeline" = “UniversalPipeline"表示該SubShader是給URP用的「HDRP設置為"HDRenderPipeline”」
  • 并使用HLSL的宏替代CG:
  • Built-inURP
    CGPROGRAM、HLSLPROGRAMHLSLPROGRAM
    ENDCG、ENDHLSLENDHLSL
    CGINCLUDE、HLSLINCLUDEHLSLINCLUDE
    • 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

    • include對應:
    \Built-inURP
    CoreUnity.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
    LightAutoLight.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
    ShadowsAutoLight.cgincPackages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl
    Surface shadersLighting.cgincURP內沒有,可以參考該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

    • Builtin RP和URP對應的光照模式:
    Built-inURP
    ForwardBaseUniversalForward
    ForwardAdd移除,開啟關鍵字_ADDITIONAL_LIGHTS解決
    Deferred 以及相關URP12.0支持
    Vertex and related移除
    ShadowCasterShadowCaster
    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_AMBIENThalf3(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_WorldToShadowfloat4x4 _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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。