【深度和法线纹理】
1、使用深度和法线纹理进行边缘检测,则不会受纹理、光照的影响。
深度纹理的范围是[0, 1]。而NDC坐标下深度范围是[-1,1]。转换公式:
d = 0.5*Zndc + 0.5
2、如何在Unity中获取这两种纹理。
Unity中,深度纹理可以直接来自于真正的深度缓存,也可以由一个单独的Pass渲染而得。取决于使用的渲染路径。
在延迟渲染中,深度缓存可以从G-Buffer中获取。
在前向渲染中,无法直接获得深度缓存。通过一个单独的Pass渲染而来。Unity会使用Shader Replacement技能选择物体:
1)那些RenderType为Opaque.
2)RenderQueue是否小于2500(bakground、geometry、alphatest)。
3)LightMode为ShadowCaster。
深度纹理的精度为24位或16位。
深度+法线纹理为32位,RG为法线信息,BA为深度信息。Unity使用一个独立的Pass来渲染整个场景。Camera-DepthNormalTexture.shader。
camera. depthTextureMode = DepthTextureMode. Depth;
上述代码开启深度纹理。之后可以在Shader中声明 _CameraDepthTexture变量来访问。
camera. depthTextureMode = DepthTextureMode. DepthNormals;
上述代码开启深度+法线纹理。通过 _CameraDepthNormalsIsTexture 变量来访问。
camera. depthTextureMode |= DepthTextureMode. Depth;
camera. depthTextureMode |= DepthTextureMode. DepthNormals;
上述代码同时生成深度、深度+法线纹理。
float d = SAMPLE_ DEPTH_ TEXTURE(_ CameraDepthTexture, i. uv);
使用 SAMPLE_DPTH_TEXTURE宏来获取纹素。
LinearEyeDepth 负责把深度纹理转换到视角空间下的深度值。
Linear01Depth负责返回一个范围在[0,1]的值。
DecodeDepthNormal 解出 depth+normal纹素。解出的深度为[0,1],法线为视角空间下的法线方向。
3、利用深度纹理来计算Camera移动速度,实现运动模糊。
只适用于GameObject静止,而Camera运动的情形。
速度映射图,存储了每个像素的速度,通过速度可以决定模糊的方向和大小。
1)根据深度缓冲计算当前帧像素 CameraPos。
2)根据CameraPos,以及前一帧的ProjMat,计算出上一帧像素位置。
4、利用深度纹理来重建像素在世界空间中的位置,实现屏幕雾效。
5、使用深度、法线纹理进行边缘检测。
选取对角线方向的深度或法线值,比较它们之间的差值。
6、