首页 >Unity3D频道 >【Unity3D研究院之游戏开发】 > Unity3D研究院之URP下PrePassZ(一百一十九)
2020
10-18

Unity3D研究院之URP下PrePassZ(一百一十九)

URP以后并不是所有Pass都会执行,因为它预制了两个Pass所以,优先执行”UniversalForward”在执行”SrpDefaultUnlit”的Pass

 Pass {
 	Tags{"LightMode"="UniversalForward"}
 	ZWrite On
 	ColorMask 0
 }
 Pass {
 	Tags{"LightMode"="SrpDefaultUnlit"}
 	//.....
 }

以上代码就可以在URP中实现PrePass的功能,如果场景中只绘制一个物体那么这样做没啥问题,可是如果场景绘制多个相同材质或不同参数的物体,那么这样做就无法启动SRP Batcher了。

接着我们将PrePass单独拆出来,

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
Snip20201018_2

添加多个物体以后在FrameDebug中即可看到,PrePass和Transparent都进行了SRP Batcher。

Snip20201018_3

PrePass是处理半透明物体的一个技巧,其实在Alpha Test物体上它还能起到优化的作用,比如有好多层Alpha Test 前面挡住后面,如果提前PrePass一下,这样early-z或HSR会剔除掉被挡住的Alpha Test物体并且不执行它的片元着色器。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之URP下PrePassZ(一百一十九)》有 3 条评论

  1. 星光白云说:

    开启prePass 怎么看被遮挡的片元被剔除掉呢

  2. PurpleMoon说:

    查阅了一些资料后知道啦,谢谢分享~

  3. PurpleMoon说:

    请问“PrePass是处理半透明物体的一个技巧”指的是?

留下一个回复

你的email不会被公开。 必填项已用 * 标注。