问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Unity Shader - 深度图基础及应用

发布网友 发布时间:2022-10-25 21:38

我来回答

1个回答

热心网友 时间:2023-09-12 03:52

深度图里存放了[0,1]范围的非线性分布的深度值,这些深度值来自NDC坐标。
在延迟渲染中,深度值默认已经渲染到G-buffer;而在前向渲染中,你需要去申请,以便Unity在背后利用Shader Replacement将RenderType为Opaque、渲染队列小于等于2500并且有ShadowCaster Pass的物体的深度值渲染到深度图中。

第一步:在C#中设置Camera.main.depthTextureMode = DepthTextureMode.Depth;

可以在主摄像机的Camera组件下看见提示:

这表明了主摄像机渲染了深度图

第二步:在Shader中声明_CameraDepthTexture

第三步:访问深度图

利用覆盖屏幕的uv值和深度图中的深度,我们可以重建出物体在世界空间中的坐标。
主要有以下两种方法:

首先要在C#脚本中传递当前的VP逆矩阵:

然后在Shader中首先制造NDC坐标:

利用当前的VP逆矩阵将NDC坐标转换到世界空间:

具体用法可以到下面的MotionBlur例子中查看。

首先需要知道,Post Process实际上是渲染一个覆盖屏幕的Quad,因此屏幕四个角对应摄像机的视椎体四个角。
首先是算出摄像机到四个角的向量:

假设有个绿点在toTopLeft所在线上,利用相似三角形,可以得到:

而depth是能够在Shader中获得的,因此我们只需要传递toTopLeft / near到Shader中就能计算出toGreen:

在Vertex中判断出对应顶点所在的向量:

可以看到uv值和对应的索引值正好是二进制的关系,所以可以如下求出:

你可能奇怪这样只能求到4个角线上的点,但vertex到fragment的过程中是有个东西叫插值的,这个插值正好能把每个像素所在的向量求出。
然后我们就能在fragment中求出世界坐标了:

具体的用法可以到下面的垂直雾效例子中找到。

输出[0,1]范围的深度值即可,如下:

思路是判断当前物体的深度值与深度图中对应的深度值是否在一定范围内,如果是则判定为相交。
首先访问当前物体的深度值:

然后访问深度图。由于此时不是Post Process,因此需要利用投影纹理采样来访问深度图:

最后就是进行相交判断:

在相交高亮效果的基础上,加上半透明边缘高亮,就能制造出一个简单的能量场效果:

思路是让雾的浓度随着深度值的增大而增大,然后进行的原图颜色和雾颜色的插值:

思路与相交高亮效果类似,只是这里是Post Process。自定义一个[0,1]变化的值_CurValue,根据_CurValue与深度值的差进行颜色的插值:

利用上面提到的第二种重建世界空间坐标的方法得到世界空间坐标,判断该坐标的Y值是否在给定阈值下,如果是则混合原图颜色和水的颜色:

利用上面提到的第二种重建世界空间坐标的方法得到世界空间坐标,让雾的浓度随着Y值变化:

思路是取当前像素的附近4个角,分别计算出两个对角的深度值差异,将这两个差异值相乘就得到我们判断边缘的值。
首先是得到4个角:

然后是得到这4个角的深度值:

最后就是根据对角差异来得到判断边缘的值:

运动模糊主要用在竞速类游戏中用来体现出速度感。这里介绍的运动模糊只能用于周围物体不动,摄像机动的情景。
思路是利用上面提到的重建世界坐标方法得到世界坐标,由于该世界坐标在摄像机运动过程中都是不动的,因此可以将该世界空间坐标分别转到摄像机运动前和运动后的坐标系中,从而得到两个NDC坐标,利用这两个NDC坐标就能得到该像素运动的轨迹,在该轨迹上多次取样进行模糊即可。
首先是得到世界坐标(这里使用提到的第一种重建方法):

然后是计算出运算前后的NDC坐标:

最后就是在轨迹上多次取样进行模糊:

景深是一种聚焦处清晰,其他地方模糊的效果,在摄影中很常见。
思路是首先渲染一张模糊的图,然后在深度图中找到聚焦点对应的深度,该深度附近用原图,其他地方渐变至模糊图。
第一步是使用SimpleBlur Shader渲染模糊的图,这里我只是简单地采样当前像素附近的9个点然后平均,你可以选择更好的模糊方式:

第二步就是传递该模糊的图给DepthOfField Shader:

第三步就是在DepthOfField Shader中根据焦点来混合原图颜色和模糊图颜色:

https://github.com/KaimaChen/Unity-Shader-Demo/tree/master/UnityShaderProject

Unity Docs - Camera’s Depth Texture
Unity Docs - Platform-specific rendering differences
神奇的深度图:复杂的效果,不复杂的原理
SPECIAL EFFECTS WITH DEPTH
GPU Gems - Chapter 27. Motion Blur as a Post-Processing Effect
《Unity Shader 入门精要》
《Unity 3D ShaderLab 开发实战详解》

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
江西服装学院究竟怎么样 江西服装学院怎样 江西服装学院怎么样啊 服装学校师资哪里比较好 江西服装学院怎么样呢 报案警察如何处理弃婴法律上如何认定 公安机关如何处理弃婴 光宗耀祖名词解释光宗耀祖的解释是什么 呼吸37度时光能量适合什么肤质 2012年1月24日(初二)从武汉天河机场到当阳,不知道是坐火车、汽车,在武... 商标侵权赔偿涉及哪些法律依据? 苹果6怎么登两个? 苹果6可以同时上两个吗?怎样才能有两个? 苹果6上怎么挂两个 限号2022年10月最新限号 htcg11 怎么退出go桌面 索爱手机如何退出go桌面 接力go怎么退出账号 用非主流语言写“单纯的世界,只有欺骗” 运维调试:Istio kubelet 的工作流程 卡丝面膜好用吗 搞笑谜语及答案经典 上海海运学院的蒋生元 战火熔炉:抗美援朝中,志愿军三十多人俘获六十余美军是真的吗? 盐城市凯瑞泽电器贸易有限公司怎么样? 掰豆角还是摘豆角 什么属相家里适合摆放老虎 虎摆件适合哪些属相 东风3型火车机车,是内燃机车,还是电力机车 东风3型内燃机车是怎样造的 笔记本改装成台式机 甘肃股权托管卡怎么在网上查询信息 甘肃永靖营业执照代办电话? 阳台安洗衣机洗手盆上面还有立式太阳能热水器怎么改水 植物龙铁怎么养殖 植物龙铁如何养殖 从入门到精通,《饥饿龙》30秒秒上手 闭上眼睛作文 不愉快的中秋节作文 随身玩伴多罗猫的介绍 生活唯美短句 上古大神女娲的发源地在哪 邱少云的生平? 有谁知道伏老是谁? 天水市伏虎简介,生平介绍,出生地等。 孩子十岁手指头上长满密密麻麻小水泡一个小拇指指蛋就三十多个怎么回事 鱼缸不用玻璃胶改用水泥行不行??? 新鱼缸放着不用胶会老化吗。 我是大玩家任禾推倒杨夕是第几章 金士顿(Kingston)低电压版 DDR3 1600 4GB 笔记本内存 是什么意思 为什么本田凌派底盘很松散