URPshader的一些built-in不能用的东西记录
看的教程大部分都是教built-in的东西,实际写的时候发现项目是URP,有些细节还是不一样的。
- 首先是FallBack,如果FallBack的是之前Built-in的一些shader其实都是用不了的。
- LightMode不能再使用ForwardBase。需要改写成UniversalForward
同时这两行预定义注解也要删除
#define UNITY_PASS_FORWARDBASE
#pragma multi_compile_fwdbase
- 不再使用CGPROGRAM/ENDCG,改为使用HLSLPROGRAM/ENDHLSL。同理CGINCLUDE也需要更改成HLSLINCLUDE
- UnityCG.cginc的引用改为
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl
- AutoLight.cginc的引用改为
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl
Packages/com.unity.render-pipelines.universal/ShaderLibrary/Shadows.hlsl
- 常用的一些函数的替换:
裁剪空间坐标转换——UnityObjectToClipPos -> TransformObjectToHClip
世界空间法线转换——UnityObjectToWorldNormal -> TransformObjectToWorldNormal
世界空间的视线方向——UnityWorldSpaceViewDir -> GetCameraPositionWS() - i.worldPos
世界空间普通矢量转换——UnityObjectToWorldDir -> TransformObjectToWorldDir
//注意 法线用这个会得到错误的结果 如下图所示 法线的转换请用TransformObjectToWorldNormal
世界空间的光照方向——UnityWorldSpaceLightDir -> _MainLightPosition.xyz - TransformObjectToWorld
模型空间的光照方向——ObjSpaceLightDir -> TransformWorldToObject
- 也可以使用URP在Core.hlsl提供的一些简便的函数如
GetVertexPositionInputs/GetVertexNormalInputs这种方法来获取所需要的变量。
- 常用的一些变量的替换:
主要平行光的颜色——_LightColor0 -> _MainLightColor
世界空间的光源方向——_WorldSpaceLightPos0 -> _MainLightPosition
特殊的:
接收阴影——UNITY_SHADOW_COORDS -> UPR没有这个玩意 需要去在结构体里定义一个float4 shadowCoord :TEXCOORD0;
接受雾效——UNITY_FOG_COORDS -> 同上 需要定义一个float fogCoord : TEXCOORD0;
- fixed都寄了,大伙只能用float了
- 获取深度图(均默认开启了depthTextureMode)
built-in获取深度图:
o.scrPos = ComputeScreenPos(o.vertex); float depth = UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.scrPos))); float depthValue = Linear01Depth(depth);
URP获取深度图:
o.scrPos = ComputeScreenPos(o.vertex); float2 screenPos= i.scrPos.xy / i.scrPos.w; float depthValue = LinearEyeDepth(SampleSceneDepth(screenPos), _ZBufferParams);
之后可能也会遇到别的情况,如后处理部分还没做。因此不定时更新。
更多详情可参考这篇文章
From Built-in to URP