shader中DEPTH数据-的存储与使用

8次阅读

共计 1424 个字符,预计需要花费 4 分钟才能阅读完成。

简言

在 shader 中我们会经常用到场景的 depth 数据,这里记录的是相关的坐标计算过程以及 depth 使用的技巧。

数学推算记录

在 http://www.songho.ca/opengl/g… 这里给出了投影矩阵的具体计算

顶点计算过程:
相机空间某点 point [x,y,z,1] 经过投影矩阵计算得到点 –[xxx, xxx, Az+B, -z]–//point in 投影空间 A = -(f+n)/(f-n) B=-2fn/(f-n)
再经过 perspective division 得到 ———————–z_n=-A/z -B ———-//z in NDC 空间 z_n [-1,1]
depthBuffer 存储的深度值范围是【0,1】————–z_b=z_n*0.5+0.5;——//z in depthBuffer/Texture z_b [0,1]

推算:
z_view to z_b:

z_b= (far (z_view + near))/(z_view (far – near)); //———-range:[0,1]

z_b to z_view:

z_view=(near far ) / (( far – near) z_b- far ); //——– range:[-near,-far]

Reference

https://stackoverflow.com/que…
http://olivers.posterous.com/…

存储深度数据

介绍

  • 使用 DEPTH TEXTURE 存储深度信息
  • 利用 color encode 存储深度信息

利用 rgba 存储深度数据

vec2 PackDepth16(in float depth)
{float depthVal = depth * (256.0*256.0 - 1.0) / (256.0*256.0);
    vec3 encode = fract(depthVal * vec3(1.0, 256.0, 256.0*256.0) );
    return encode.xy - encode.yz / 256.0 + 1.0/512.0;
}

float UnpackDepth16(in vec2 pack)
{float depth = dot( pack, 1.0 / vec2(1.0, 256.0) );
  return depth * (256.0*256.0) / (256.0*256.0 - 1.0);
}

vec4 PackDepth32_orig(in float frag_depth) {vec4 bitSh = vec4(256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0);
  vec4 bitMsk = vec4(0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0);
  vec4 enc = fract(frag_depth * bitSh);
  enc -= enc.xxyz * bitMsk;
  return enc;
}

float UnpackDepth32_orig(const in vec4 enc) {const vec4 bit_shift = vec4( 1.0 / ( 256.0 * 256.0 * 256.0), 1.0 / (256.0 * 256.0), 1.0 / 256.0, 1.0 );
  float decoded = dot(enc, bit_shift);
  return decoded;
}

Reference

https://stackoverflow.com/que…
http://aras-p.info/blog/2009/…

正文完
 0