在Unity的后处理shader中通过屏幕像素坐标和深度贴图反推世界坐标

这篇博客探讨了如何在Unity中利用屏幕像素坐标和深度贴图来反推世界坐标。作者通过设置相机的depthTextureMode为Depth或DepthNormal,结合相机的投影矩阵,实现这一过程。为了验证计算的准确性,作者在物体材质上应用shader,并比较Scene视图和Game视图中物体颜色的一致性。在Game视图中,背景的彩色显示表明后处理逻辑成功地处理了屏幕上的所有像素,将不在物体上的像素映射到了视锥体的far截面上。
摘要由CSDN通过智能技术生成
要通过屏幕像素坐标反推世界坐标,就要知道世界坐标是如何变换为屏幕坐标的。理论上,将世界坐标(x, y, z)变换为(u, v, d)的过程如下:

第一步,将坐标点(x, y, z, 1)乘以从世界坐标系到相机坐标系的转换矩阵(World-to-Camera 4x4 Matrix),将坐标点(x, y, z, 1)变换为相机空间(Camera Space)坐标,转换后的坐标为(x1, y1, z1, w1),其中w1 = 1。

第二步,将相机空间坐标乘以从相机坐标系到裁剪空间(Clipping Space)坐标系的投影矩阵(Projection 4x4 Matrix),将坐标点转换到裁剪空间,转换后的坐标为(x2, y2, z2, w2),其中w2 = -z1。在Unity中,如果坐标点位于视锥体内(z1 > 0),那么x2,y2的范围都是[-z1, z1],z2的范围是[-z1, 0]。也就是说,我们可以想象这一步是将视锥体“压扁”成一个半立方体。

第三步,将裁剪空间中的坐标(x2, y2, z2, w2)除以w2,得到一个归一化的坐标(x3, y3, z3, 1),也就是说,x3, y3的范围是[-1, 1],z3的范围是[0, 1]。 根据摄像机投影的屏幕区域(通常是整个屏幕)和x3, y3,就可以得知这个坐标点在屏幕上的位置。z3则是深度。

投影矩阵的推导可参见:http://www.songho.ca/opengl/gl_projectionmatrix.html
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值