URP以后并不是所有Pass都会执行,因为它预制了两个Pass所以,优先执行”UniversalForward”在执行”SrpDefaultUnlit”的Pass
1 2 3 4 5 6 7 8 9 10 11 |
Pass { Tags{"LightMode"="UniversalForward"} ZWrite On ColorMask 0 } Pass { Tags{"LightMode"="SrpDefaultUnlit"} //..... } |
以上代码就可以在URP中实现PrePass的功能,如果场景中只绘制一个物体那么这样做没啥问题,可是如果场景绘制多个相同材质或不同参数的物体,那么这样做就无法启动SRP Batcher了。
接着我们将PrePass单独拆出来,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Shader "Unlit/PrePass" { SubShader { Pass { Tags{"LightMode"="UniversalForward"} ZWrite On ColorMask 0 HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl" struct v2f { float4 vertex : POSITION; }; v2f vert (float4 vertex : POSITION) { v2f o; o.vertex = TransformObjectToHClip(vertex); return o; } float4 frag (v2f i) : SV_Target { return 0; } ENDHLSL } } } |
添加一个RendererFeature 接着Filters中选择Transparent和物体的Layer
添加多个物体以后在FrameDebug中即可看到,PrePass和Transparent都进行了SRP Batcher。
PrePass是处理半透明物体的一个技巧,其实在Alpha Test物体上它还能起到优化的作用,比如有好多层Alpha Test 前面挡住后面,如果提前PrePass一下,这样early-z或HSR会剔除掉被挡住的Alpha Test物体并且不执行它的片元着色器。
- 本文固定链接: https://www.xuanyusong.com/archives/4759
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!
开启prePass 怎么看被遮挡的片元被剔除掉呢
查阅了一些资料后知道啦,谢谢分享~
请问“PrePass是处理半透明物体的一个技巧”指的是?