从depth buffer中构建view-space position

观察透视投影矩阵:

 

对于x和y,矩阵变换只是一个缩放系数,那么逆变换就是缩放系数的倒数,所以 

    

 

设Xndc Yndc为NDC空间中的XY坐标,Xview Yview Zview为view space中的坐标,则

   

 

所以

    

 

所以已知XY的NDC坐标和view space z,就能求出view space position,写成代码就是:

float M = tan(fov*0.5f)*aspect;
float N = tan(fov*0.5f);
float3 GetViewSpacePos(float2 NDCPos, float ViewSpaceZ)
{
    float3 VPos = float3(NDCPos.xy, 1.f) * float3(M, N, 1.f);
    return VPos * ViewSpaceZ;
}

如果depth buffer中已经存储了线性的view space depth,那么只需采样出depth,然后计算出position即可;如果depth buffer中储存的是非线性的perspective z(NDC z),那么需要先把perspective z逆变换为view space z,再使用上述方法计算position。

把perspective z变换为view space z:

对于view space z,乘以投影矩阵然后除以w得到ndc z:

由上式可得:

其中

 

写成代码就是:

float P0 = 1/zn;
float Q = zf/(zf - zn);
float P1 = 1/(zn*Q);

float PerpectiveZToLinearZ(float Zndc)
{
    return 1.f / (P0 - P1 * Zndc);
}

 

所以对于perspective z,构建view-space postion的代码如下:

 

float3 GetViewSpacePos_NDCZ(float2 NDCPos, float Zndc)
{
    float ViewSpaceZ = PerspectiveZToLinearZ(Zndc);
return GetViewSpacePos(NDCPos, ViewSpaceZ);

}

 

转载于:https://www.cnblogs.com/viX0026/p/6533719.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值