Unity-URP 实现遮挡高亮

实现原理

URP可以根据Layer定制渲染顺序,所以做三遍渲染,第一遍渲染障碍物层,第二遍渲染高亮层,第三遍正常渲染

有深度测试实现法,和模板测试实现法,我也是参考了深度测试的实现方法,探索出的模板测试实现法

深度测试实现在某些情况下 会影响深度渲染,导致物体渲染不正确,所以才用模板测试,不影响深度,渲染结果更加准确

模板测试实现最终效果
在这里插入图片描述

模板测试实现

找到Urp渲染管线资源,关闭特殊渲染顺序需要的Layer,使用RenderFeature 渲染
在这里插入图片描述

在这里插入图片描述
新建一个Shadow 材质,用于遮挡部分
在这里插入图片描述
新建Layer, 做一个player 层,一个front层,当player 被front遮挡,player被遮挡部分使用Shadow材质
在这里插入图片描述

三层渲染,
在这里插入图片描述

Env Front渲染层

front Layer,
设置深度测试正常,LessEqual,离相机近的覆盖远的,(或者关闭深度测试,自动体现深度)
设置模板测试总是通过,设置1

原理:第一层为后面层的渲染打下基础,
深度可以关闭
模板测试总是通过是为了让后面层可以检测模板值

在这里插入图片描述

Shadow 渲染层

Player layer,高亮材质

设置深度测试总是通过Always,不需要深度写入,Less Equal会体现深度信息,我们不需要体现深度

设置模板测试等于1时,通过测试(因为遮挡物的模板值为1),通过测试后,不需要修改模板值,保持即可(没有更多层需要模板值)
设置一个高亮材质(当渲染此层时,使用此材质)

原理:深度测试总是通过是因为 物体在障碍物后面,物体的深度信息比障碍物大,因此Greater 也可以,只有物体深度通过,高亮才能覆盖障碍物层,这也是深度测试实现的核心(实际上模板测试实现也需要深度支持)
在这里插入图片描述

Player渲染层

Player Layer, 要产生高亮的物体
通过Event 和Filters正确渲染物体即可 ,不透明物体在透明物体前渲染
Filters 从渲染队列(是否透明),和Layer Mask找到Player

设置正确的深度测试(近的覆盖远的,Less Equal),或者关闭深度测试(自动体现深度信息)

在这里插入图片描述

深度测试实现

全部关闭模板测试,第一层和第三层正常渲染,
第二层改变深度为,大于深度值才进行渲染 Greater, 即可
在这里插入图片描述

总结:

深度测试实现比较简单,在障碍物与player 属于同一渲染层时比较适合(shader中的渲染顺序,比如都是不透明物体)

如果不属于同一渲染顺序,可能需要模板测试进行辅助,要正确设置效果,需要理解Unity中深度测试与模板测试以及shader的渲染顺序

猜你喜欢

转载自blog.csdn.net/euphorias/article/details/123088926