实现原理
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的渲染顺序
|