unity中深度纹理CameraDepthTexture的使用须知

此篇清楚以后的更深层解析:深度图采样解析
深度图CameraDepthTexture,网上的介绍一大堆,很多人可能会使用深度图并且能够实现一定的效果。。。。然而,问题依然存在:
(1)他并不明白深度图中的深度是怎么比较的?
(2) 从深度图_CameraDepthTexture中采样出的深度,对应场景中哪个点?

例如:水的颜色是怎么样通过 深度 来确定的?!
下面来详细的讲解一下:
第一:深度图的形成:
(1)图中存的是像素d:[0,1];归一化的NDC坐标的Z值是[-1,1],将NDC坐标转化为[0,1]就是存在深度图中的值
在这里插入图片描述

(2)NDC坐标中的Z值是哪来的?!
坐标转换:从模型空间- 世界空间 - 视图空间 - 裁剪空间 - 屏幕空间
直接略过前两个空间,这里说一下 :从视图空间 - 屏幕空间这个转换
视图空间 - 乘以齐次裁剪矩阵- (齐次)裁剪空间
注意!!!
首先:从视图 - 裁剪: 此时并未进行“齐次除法”,不是归一化的坐标!!!在shader中vert着色器中,也只是转化到了这个阶段,并未在vert中进行归一化

然后:在frag中进行齐次除法归一化,
以上两步在 冯乐乐的 入门精要中已经说的很清楚了,附网址:
https://blog.youkuaiyun.com/linuxheik/article/details/79446780
(3)哪些物体会被存储到深度图中?!!!
看似很简单,但如果这个搞不清楚,在计算深度差值的时候,绝对是一脸懵逼!!!
我直接说结论:
第一条:Queue = Transparent 的不会被存进深度图
第二条:没有被ShadowCaster通道,或者没有单独画进深度图的通道

符合1或2条,就不会被计算存储到深度图中(**

是不是半透明,非常关键

**)
下面我举个例子:
第一种情况:水面 Queue != Transparent
第二种情况:水面 Queue = Transparent
这两种情况下的深度计算的意义是啥?!
在这里插入图片描述
搞清楚 从深度图_CameraDepthTexture中采样出的深度,是哪个位置的值。

(最后)_CameraDepthTexture 和 ZBuffer的区别:
_CameraDepthTexture中的深度 和 GPU里使用的ZBuffer深度图是不一样的:

ZBuffer深度图并不关心你是透明还是不透明, 只要标记ZWrite On就会写入深度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值