欢迎光临散文网 会员登陆 & 注册

深度缓冲与深度测试的应用

2023-03-08 09:20 作者:独立游戏人-老雷  | 我要投稿

前言

今天给大家分享的是游戏当中对于深度缓冲非常实用的一些应用的讲解,希望给大家带来帮助

比如说游戏当中的扫描效果啊,游戏当中的透视效果啊,游戏当中的边缘检测,边缘绘制效果啊,游戏当中的能量球效果啊等等

特别是大家知道,现在我游戏开发已经进入到URP渲染管线的阶段了,所以如果你现在在学习这些效果的时候,还是基于内置管线进行开发的,那么建议你深入学习这些效果,在URP管线下面的实现储备好自己的知识和技能,适应新的TA技术迭代

点击观看

版权声明

本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明

更多学习资源请私信我获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

点赞、关注、分享可免费获得配套学习资源


《无人深空》扫描效果

第一步:C#脚本刷新扫描区域

深度缓冲可以做什么呢?比如说《无人深空》的扫描效果

这个效果需要在后处理阶段实现

我们可以利用深度缓冲区来采样深度缓冲纹理,采样到深度缓冲纹理以后,我用深度缓冲纹理的深度值,比如说我们采样的是场景中间的区域,假设我的摄像机是在离场景比较远的,大概在0这个位置,三角区域是它的一个视角范围,这个时候用我从深度图中采样到的深度值,跟我当前扫描的距离做一下对比

一开始的时候它从摄像机的起始位置去扫,比如说我扫距离摄像机距离为零的位置,然后是一的位置,然后是二的位置,一直扫描到距离为十的位置,我用横线去表示这个是距离为十

它扫描的范围是从距离八到距离十,因为整个场景都会被拍到深度图里面,那我去取比如方块那里像素点的深度值,假设这个深度值是九,这个时候算一下,9介于8~10之间,这个像素就是属于在扫描效果里面将要去进行颜色叠加的像素点

并且9在扫描带中间,而扫描效果最前面的绿色应该是不透明度最高的,那么我就将9的不透明度设置为比如说0.5,就可以看到一个半透明的绿色

大家可能平时在网上去看一些免费教程的时候会发现,这个效果都是用像我这边贴的代码一样,它是用内置管线去实现的,但实际上我们的unity现在已经进入到URP的时代了

所以我们再这么写代码是不行的,因为这样的代码就根本就无法工作在URP环境下,在URP管线下的“扫描效果”的后处理实现,请参考小白的TA之路



在游戏里面也可以用我们的深度测试来去实现一个透视效果,那么怎么实现呢

第一步: 透视效果

透视效果就是以进行两遍渲染这个地方,我们的核心点是把ZTest设为Greater,也就是说被遮挡住的部分,反而通过深度测试,将被遮挡角色渲染出来

然后我们再写一个pass,这个pass是把场景里面可以看见的角色,比如说这个角色按照正常的这种叫做小于测试,也就是深度值较小的物体被渲染,这样的话就不是渲染我们的墙背后的物体,而是墙前面的这个物体

核心代码如图:

第二步:边缘光

当然你也可以给这个效果效果去加一些边缘光的处理

上面写的这个代码是内置管线的代码,内置管线可以写N多个pass,这些pass都会被我们的引擎逐个执行,但是在URP管线下面,并不是写一个他就执行一个,Unity只会执行特定的Pass

护盾/能量场效果

第一步:半透明能量场

通过将能量场模型放在半透明队列,可以确保它在所有不透明物体绘制完毕后被绘制,并与不透明物体进行颜色混合,从而形成半透明效果

如果你不把它放到半透明队列里,那么这个时候在我们进行能量球的扰动,它因为能量球会对周围的空气造成扰动,做空气扰动的时候,就不能够对周围的不透明物体来进行扰动,因为我们知道半透明物体是在不透明物体之后被渲染的

第二步:边缘光

我们要实现一个边缘光,那么这个边缘光的强度怎么计算呢?

abs(dot(i.normal,normalize(i.viewDir)));  //边缘光的计算,法向量与视向量进行点乘

传统的费尼尔效果用的是pow,但这里要用abs;关于为什么要用abs,如果感兴趣的话大家可以在评论区讨论

第三步:相交高亮

我们可以看到圆球底下交界的位置都有一圈高亮,那这个高亮是怎么样去实现呢?这里就要用到深度缓冲区的知识

假设能量球顶部的这个点,从场景顶部的物体视角看过去,它的背后是背景,因此不跟场景里面的物体相交接

背景的深度值是1.0,那么这个位置的深度值可能是0.5或者0.3,算一下这个点的能量球的深度值跟他背后的物体的深度值的深度差,如果深度差比较大,那就说明不是物体相交的部分,这时候我们正常渲染这个能量球就可以了

因为我们定位的深度值跟能量球在这个位置的深度值是几乎差不多的,所以我们就应该把它渲染成高亮的一个颜色

如上图所示,红色方框中的算法是相交高亮的算法

第四步:表面扭曲

扭曲效果在我们早期的内置管线里面,我们直接用一个Pass就能实现了

但是我前面讲过:

  • GrabPass也是一个pass

  • URP不是写一个pass,unity就去执行一个pass

  • URP管线执行Pass是有条件的,这样的效果在URP管线里面如何实现大家呢?请参考小白的TA之路

深度缓冲的其他应用

当然深度缓冲,其实还有其他的一些应用,比如说可以用它来做二次元的效果,通常都要做边缘检测,这个怎么做

比如说我们用深度缓冲可以用来去做水的渲染,那这个具体又该怎么做呢?老师都会给大家去详细的分析每一个效果的实现原理

... ...

这边也会不定期的去开设一些公开课,去给大家去做相关的技术分享,感兴趣的小伙伴可以进群交流

URP渲染管线定制

在很多在内置管线的图形渲染资料中,比如说跟冯乐乐的入门精要中我们学到的一些效果,当你到了URP管线下的时候,就发现它实现起来,根本不是那么回事,而我们的TA岗位面试,公司都会有要求能够掌握在URP管线下如何进行渲染效果的开发

那这样的话就要求我们的TA同学不仅仅掌握Shader开发的知识,还要掌握C#脚本开发的知识,因为只有掌握了,才能够进行所谓的渲染管线的定制,去实现这样的效果

URP渲染管线定制不仅仅可以帮我们实现渲染效果,也可以帮我们实现渲染优化

下面图示在2019开发者大会上面,有开发者分享了一个使用URP渲染管线可以优化渲染性能,更容易处理一些渲染上面的一些问题


写在最后

更多学习资源请私信获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

点赞、关注、分享可免费获得配套学习资源

【TA进阶】深度缓冲与深度测试的4个应用

深度缓冲与深度测试的应用的评论 (共 条)

分享到微博请遵守国家法律