UnityShader_深度纹理简介

什么是深度纹理

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

你可能感兴趣的:(UnityShader)