深度图像信息的应用

来源:互联网 发布:抢网速的软件 编辑:程序博客网 时间:2024/06/06 03:52

一、Unity获取深度图像


1.在Unity中由于是Forward Shading,前向渲染,所以我们需要设置摄像机可以获取深度信息,如果是Deferred Shading ,延迟渲染的话就不用手动设置获取深度信息。


2.我们需要新建一个Shader文件用于获取摄像机所捕获到的画面的深度信息。当我们开启获取深度信息后,我们可以通过参数 _CameraDepthTexture 来获取每个像素点深度信息,然后利用内建的宏UNITY_SAMPLE_DEPTH来处理深度信息,但是由于获取的深度信息不是线性的,所以需要用Linear01Depth来将深度信息转换为线性,这样就能将深度信息渲染成一张灰度图。




/************************************************************************************华丽的分割线********************************************************************************************/


二、利用深度信息做光线扫描效果


扫描效果这种全屏特效,可以通过获取摄像机渲染到的一副画面,然后我们通过深度信息对画面的每个像素点进行处理,当扫描线经过的地方就将扫描线的颜色与物体的颜色进行叠加,并且为了有扫描线的效果,我们需要加入扫描线宽度的概念。

1.首先还是先获取摄像机当前画面的深度信息,然后线性化后渲染成一副图。


2.线性化后的图的深度在被限制在【0,1】, 扫描距离通过cs脚本与时间和扫描线的移动速度来计算求得,也需要限制在【0,1】,同时由于当线性化后的深度值为1是,代表摄像机的远裁切面,所以不能为1,否则整个屏幕都会被扫描线刷过。


3.在cs脚本中,我们用来计算扫描线的具体距离。


4.我们需要OnRenderImage函数来回调渲染画面。



/************************************************************************************华丽的分割线********************************************************************************************/


三、透过墙看到墙后物体的轮廓描边


许多游戏中都会有,对于在墙后的敌人,给予外形描边显示。实现原理即设置两个Pass块,第一个Pass用来计算被遮挡物体的颜色显示,第二个pass来计算未被遮挡时的正常显示。而由于很多游戏中人物的描边都不只是最外边的描边,所以可以通过面向摄像机的观察方向与物体法线方向的夹角来判断物体的描边。

1.首先新建一个Shader文件,定义一个描边颜色用以给墙后的物体描边。由于物体是在墙后,在深度信息图中,物体的Z值是大于墙的Z值的,所以我们需要设置ZTest Greater,同时使用Blend 混合指令将被遮挡物体与其他物体进行混合。


2.在Vertex Shader中,分别获得物体法线和摄像机看向物体的方向,传入Fragment Shader中计算夹角。


3.在Fragment Shader中去计算视线方向与物体法线的夹角,将夹角与边缘轮廓颜色进行叠加后输出。



4.在另外一个Pass里处理未被遮挡时物体的颜色.

/************************************************************************************华丽的分割线********************************************************************************************/


、能量场/护盾效果


1. 能量场是一个透明物体,所以启用Blend混合指令,对片断着色器输出后的颜色的Alpha进行混合(Blend SrcAlpha OneMinusSrcAlpha).然后设置渲染类型和队列为透明.



2.根据观察方向和物体法线的夹角来计算能量场的边缘.


3.实现相交高亮的效果.需要注意的是_CameraDepthTexture中只保存了不透明物体的深度信息,因此是无法获取能量场的深度信息,所以要在vertex shader中计算出能量场的顶点的深度,利用COMPUTE_EYEDEPTH 宏.分别计算场景和能量场的片段着色器中的深度,然后求出深度的差异diff,然后用1-diff就求出了相交程度.



4.实现能量场的扭曲效果.原理即一张渲染能量场之前的场景的渲染图,然后随着时间去调整UV的偏移来模拟扭曲的效果.




参考来源于 https://zhuanlan.zhihu.com/p/27547127  版权所有归原作者,本文只做个人学习记录使用.