UnityShader_深度纹理简介

什么是深度纹理

深度纹理是一张存储 屏幕上各点深度值 的纹理图(就跟我们之前常用的法线贴图一样,存放的并不是颜色信息值),而纹理上的 深度值 是从 归一化的设备坐标(NDC)上获得的(该文章的后半部分有讲述)。此时我们得到的深度值z∈[-1,1],我们采用法线纹理相同的处理,d∈[0,1]即下式,得到深度纹理上的值。
在这里插入图片描述
在这里插入图片描述
在很多情况下,我们需要视角空间下的深度值(因为该空间下深度值是线性的),根据上图的矩阵公式我们容易直到
在这里插入图片描述
又因为
在这里插入图片描述
我们容易得到
在这里插入图片描述
在视角空间中,我们得到的zvisw是负数,为得到正值,对上面结果取反,我们得到
在这里插入图片描述
此时,我们得到的z’visw∈[Near,Far],我们只要将上式除以 Far 就可以得到 z01 ∈[0,1]即下图结果
在这里插入图片描述
这样我们就得到了在视角空间下[0,1]间的深度值。

如何在代码中获取深度纹理

//例子1
camera.depthTextureMode = DepthTextureMode.Depth;
//shader中用_CameraDepthTexture来获取
//_CameraDepthTexture始终指相机的主要深度纹理。相比之下,我们可以_LastCameraDepthTexture用来引用任何相机渲染的最后深度纹理。例如,如果您使用辅助摄像机在脚本中渲染半分辨率深度纹理,并希望将其提供给后期处理着色器,则这可能很有用。

//例子2
camera.depthTextureMode |= DepthTextureMode.Depth;
camera.depthTextureMode |= DepthTextureMode.DepthNormals;
//让相机同时产生一张深度图和一张深度+法线纹理

//相机相关的纹理在shader中的对应关系如下
DepthTextureMode.Depth   	   ->  _CameraDepthTexture/_LastCameraDepthTexture
DepthTextureMode.DepthNormals  ->  _CameraDepthNormalsTexture
//当前帧的每个屏幕纹理像素的运动矢量纹理
DepthTextureMode.MotionVectors ->  _CameraMotionVectorsTexture

//在shader中对上述纹理的采集
//i.uv 对应当前像素的纹理坐标
SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv) 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值