参考衔接:
【Unity Shader】 模板测试
参考这个博客中的模板测试代码,进行了下面探究
1、三个的顺序
三个物体的空间位置关系如下图;
三个物体的渲染队列如下,通过FrameDebug查看其渲染顺序为:Wall_Grayness(中间的墙)→ Sphere_InforntWall_Red(红色小球)→ Cube_BehindWall(墙后面的方块)
显示效果说明,Wall_Grayness的渲染队列为Background,先进行渲染,渲染完成后,Wall_Grayness所占屏幕区域内referenceValue值为9;其Shader中Comp Always,直接通过模板测试;显示效果如下图:
Sphere_InforntWall_Red渲染队列为Geometry,在Background之后,因此再渲染Sphere_InforntWall_Red,其shader中referenceValue值为2,判断条件为Comp NotEqual;就是说Sphere_InforntWall_Red所在区域内,如果模板缓冲区的referenceValue与Sphere_InforntWall_Red的referenceValue值不相等时,说明模板测试通过,显示Sphere_InforntWall_Red的像素;如果相等时,说明Sphere_InforntWall_Red模板测试不通过,丢弃其像素值,显示模板缓冲区中的像素值;
因此其显示效果如下:由于中间灰色墙的referenceValue(Ref)值9,与红色小球的值不相等,因此红色小球和灰色墙重叠部分,显示红色小球的像素值;
Cube_BehindWall渲染队列为Transparent,在Geometry之后,因此最后渲染Cube_BehindWall,其shader中referenceValue值为2,判断条件为Comp Equal;就是说Cube_BehindWall所在区域内,如果模板缓冲区的referenceValue与Cube_BehindWall的referenceValue值相等时,说明模板测试通过,显示Cube_BehindWall的像素;如果不相等时,说明Cube_BehindWall模板测试不通过,丢弃其像素值,显示模板缓冲区中的像素值;
因此其显示效果如下:由于中间灰色墙的referenceValue(Ref)值9,而红色小球的referenceValue(Ref)值2,因此墙后面方块在进行模板测试时,与红色小球重叠部分模板测试通过,其像素显示到模板缓冲区中,而与灰色墙重叠部分模板测试不通过丢弃;
其显示效果如下:
2、总结
上面实验中主要探讨模板测试相关,因此设置三种不同的渲染队列,在实际应用场景中,还需要考虑深度测试等其他影响渲染的因素;
按照下面三个测试,可以实现相同的效果;