OpenGL,z值转深度值计算

来源:互联网 发布:mac怎么查看隐藏文件夹 编辑:程序博客网 时间:2024/05/16 01:38

翻译:
Real depth in OpenGL / GLSL - Before I Forget…

主要是记录一下这个公式.

A   = -(zFar + zNear) / (zFar - zNear);B   = -2*zFar*zNear / (zFar - zNear);z_n = -(A*z_e + B) / z_e; // z_n in [-1, 1]z_b = 0.5*z_n + 0.5; // z_b in [0, 1]

A 和B分别是投影矩阵的3行3列和4列.那么z_n 就是点在vertex Shader最终输出的gl_position 做透视划分后的向量的z值.
通常线性照相机模型最后Project矩阵左乘顶点向量后gl_position值变成:

[don't care, don't care, Az+B, -z]

然后顶点shader跑完,openGL自动做透视划分:

gl_position=vec4(x,y,z,w);out=x/wy/wz/w

化简就得到z_n的公式了.

z_b 是把透视划分后的点从[-1,1]映射到[0,1](深度缓存值范围).感觉非常多余….

用这个方法可以解决绘制同一个物体时被前面遮挡的问题.例如我只要视野内球体内部.其截面法线垂直于我的视线:
这里写图片描述

0 0
原创粉丝点击