Tekkaman

导航

 

深度和法线纹理

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、

posted on 2018-04-02 10:51  Tekkaman  阅读(710)  评论(0编辑  收藏  举报