URP使用HLSL语言;BIPR使用CG语言
URP 的SubShader的Tags中需要添加"RenderPipeline" = “UniversalPipeline”
URP使用单一的forward通道,多个光照通过数组形式传入;BIPR每一个光照跑一个pass
合批流程不同,URP给每个不同的材质球建立持久化数据在gpu中,每一个shader变体一次合批,无论多少材质球;URP每一个材质球一次合批(下图)CBUFFER_START, CBUFFER_END
URP需要定义取样器SAMPLER(sampler_BaseMap),和取样贴图TEXTURE2D(_BaseMap);
灯光模式(LightMode)不同
内置管线 | URP |
---|---|
ForwardBase | UniversalForward |
ForwardAdd | 移除 |
Deferred以及相关 | 尚未支持 |
Vertex及相关 | 移除 |
ShadowCaster | ShadowCaster |
MotionVectors | 尚未支持 |
DepthOnly | |
Meta (for lightmap baking) | |
Universal2D |
URP变体 ,需要使用#pragma multi_compile添加一些关键字:
* _MAIN_LIGHT_SHADOWS
* _MAIN_LIGHT_SHADOWS_CASCADE
* _ADDITIONAL_LIGHTS_VERTEX
* _ADDITIONAL_LIGHTS
* _ADDITIONAL_LIGHT_SHADOWS
* _SHADOWS_SOFT
* _MIXED_LIGHTING_SUBTRACTIVE
后处理/视觉特效
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来实现。详见:链接
不再使用GrabTexture,而是使用_CameraOpaqueTexture或_CameraColorTexture。
GrabPass{ }改成 SAMPLER(_CameraOpaqueTexture),且需要开启URP管线设置的Opaque Texture。
预定义着色器宏
可能需要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