Unity3d URP 渲染管线和 Built in 渲染管线中 shader 的区别

  1. URP使用HLSL语言;BIPR使用CG语言

  2. URP 的SubShader的Tags中需要添加"RenderPipeline" = “UniversalPipeline”

  3. URP使用单一的forward通道,多个光照通过数组形式传入;BIPR每一个光照跑一个pass

  4. 合批流程不同,URP给每个不同的材质球建立持久化数据在gpu中,每一个shader变体一次合批,无论多少材质球;URP每一个材质球一次合批(下图)CBUFFER_START, CBUFFER_END
    Unity3d URP 渲染管线和 Built in 渲染管线中 shader 的区别_第1张图片

  5. URP需要定义取样器SAMPLER(sampler_BaseMap),和取样贴图TEXTURE2D(_BaseMap);

  6. 灯光模式(LightMode)不同

内置管线 URP
ForwardBase UniversalForward
ForwardAdd 移除
Deferred以及相关 尚未支持
Vertex及相关 移除
ShadowCaster ShadowCaster
MotionVectors 尚未支持
DepthOnly
Meta (for lightmap baking)
Universal2D
  1. URP变体 ,需要使用#pragma multi_compile添加一些关键字:
    * _MAIN_LIGHT_SHADOWS
    * _MAIN_LIGHT_SHADOWS_CASCADE
    * _ADDITIONAL_LIGHTS_VERTEX
    * _ADDITIONAL_LIGHTS
    * _ADDITIONAL_LIGHT_SHADOWS
    * _SHADOWS_SOFT
    * _MIXED_LIGHTING_SUBTRACTIVE

  2. 后处理/视觉特效
    URP不支持OnPreCull,OnPreRender,OnPostRender和OnRenderImage这些方法。URP支持OnRenderObject和OnWillRenderObject,但是如果在URP中使用你可能会发现问题。因此,如果你曾经在旧管线创建视觉效果时使用它们,那么现在你需要学习新方法了。URP包含以下注入点:

     * beginCameraRendering(ScriptableRenderContext context, Camera camera)
     * endCameraRendering(ScriptableRenderContext context, Camera camera)
     * beginFrameRendering(ScriptableRenderContext context,Camera[] cameras)
     * endFrameRendering(ScriptableRenderContext context,Camera[] cameras)
    

    注:如果需要在begin/endCameraRendering中渲染,需要使用RenderSingleCamera()代替 Camera.Render()。另外也可以使用ScriptableRendererFeature来实现。详见:链接

  3. 不再使用GrabTexture,而是使用_CameraOpaqueTexture或_CameraColorTexture。
    GrabPass{ }改成 SAMPLER(_CameraOpaqueTexture),且需要开启URP管线设置的Opaque Texture。

  4. 预定义着色器宏
    可能需要include 的库:
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/ShaderVariablesFunctions.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl”
    “Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareDepthTexture.hlsl”
    “Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl”

内置管线 URP
UNITY_PROJ_COORD(a) 移除了,使用a.xy / a.w代替
UNITY_INITIALIZE_OUTPUT(type,name) ZERO_INITIALIZE(type,name)
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_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)

函数:

内置管线 URP
float4 UnityObjectToClipPos(float3 pos) float4 TransformObjectToHClip(float3 positionOS)
float3 UnityObjectToViewPos(float3 pos) TransformWorldToView(TransformObjectToWorld(positionOS))
float3 WorldSpaceViewDir(float4 v) float3 GetWorldSpaceViewDir(float3 positionWS)
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复制过来
float3 WorldSpaceLightDir(float4 v) _MainLightPosition.xyz - TransformObjectToWorld(objectSpacePosition)
float3 ObjSpaceLightDir(float4 v) TransformWorldToObject(_MainLightPosition.xyz)-objectSpacePosition
float3 Shade4PointLights(…) 可以使用half3 VertexLighting(float3 positionWS, half3 normalWS)
float4 ComputeScreenPos(float4 clipPos) float4 ComputeScreenPos(float4 positionCS)
float4 ComputeGrabScreenPos(float4 clipPos) 移除了
float3 ShadeVertexLights (float4 vertex, float3 normal) 移除了,可以尝试使用UNITY_LIGHTMODEL_AMBIENT.xyz + VertexLighting(…)

变量:

内置管线 URP
_LightColor0 _MainLightColor
_WorldSpaceLightPos0 _MainLightPosition
_LightMatrix0 移除了。目前尚不支持Cookie
unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0 在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取额外光源信息
unity_4LightAtten0 在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取额外光源信息
unity_LightColor 在URP中,其他光源存储在数组/缓冲区中(取决于平台)。使用Light GetAdditionalLight(uint i, float3 positionWS)获取额外光源信息
unity_WorldToShadow float4x4 _MainLightWorldToShadow[MAX_SHADOW_CASCADES + 1] 或者_AdditionalLightsWorldToShadow[MAX_VISIBLE_LIGHTS]

其他:

内置管线 URP
UNITY_SHADOW_COORDS(x) 移除了。DIY,例如float4 shadowCoord : TEXCOORD0;
TRANSFER_SHADOW(a) a.shadowCoord = TransformWorldToShadowCoord(worldSpacePosition)
SHADOWS_SCREEN 移除了。不支持。
UNITY_FOG_COORDS(x) 移除了。DIY,例如float fogCoord : TEXCOORD0
UNITY_TRANSFER_FOG(o*,outpos) o.fogCoord = ComputeFogFactor(clipSpacePosition.z)
UNITY_APPLY_FOG(coord,col) color = MixFog(color,i.fogCoord)
LinearEyeDepth(sceneZ) LinearEyeDepth(sceneZ,_ZBufferParams)
Linear01Depth(sceneZ) Linear01Depth(sceneZ,_ZBufferParams)
ShadeSH9(normal) SampleSH(normal)
unity_ColorSpaceLuminance 移除了。使用Luminance()

以上内容部分转载自:https://www.jianshu.com/p/3fef69e2efb6

你可能感兴趣的:(unity开发,unity,shader,urp)