Unity深度图的理论知识

本文介绍了Unity中深度图的概念,包括NDC和屏幕映射的转换,详细讲解了如何在Unity中创建和使用深度图,以及如何通过深度图进行世界坐标重建。同时探讨了LinearEyeDepth和Linear01Depth的线性化处理,并展示了深度图在软粒子效果和屏幕射线插值重建中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度图的解释

在坐标变换中,顶点从裁剪空间到屏幕空间中间有两个步骤,一个是NDC,一个是屏幕映射。

NDC

在NDC之前,x,y,z,w的值跟Near和far有关,w的范围就是[Near,Far]。
经过NDC,即用w除以x,y,z,此时x,y,z的值范围是[-1,1],w是1.(但在OpenGl中,z的范围是[0,1])。
z就是深度值
储存到纹理中映射一下:d=z*0.5+0.5

屏幕映射

经过NDC后,在根据屏幕像素来把x,y映射到屏幕上。
映射方法:

screen_x = clip_x * pixelWidth/ 2 *clipx+pixelWidth/ 2
screen_y = clip_y * pixelHeight/ 2 *clipx+pixelHeight/ 2

裁剪空间的坐标(clip_x,clip_y)

屏幕像素(pixelWidth,pixelHeight)

每个顶点的原始的Z值是视空间的深度,转化到屏幕空间后,在屏幕空间的深度与1/z成正比才可以在屏幕空间逐像素地进行插值进而获得屏幕上任意一点像素的屏幕空间深度值。

使用时要把屏幕空间的深度再转换回原始的视空间深度。

使用深度图

v2f

分配一个储存器存储

float4 projPos : TEXCOORD5;

顶点着色器

计算在屏幕空间的点,获取深度值z

o.vertex = UnityObjectToClipPos(v.vertex);
o.projPos = ComputeScreenPos (o.vertex);//计算顶点在屏幕空间的位置(没有进行透视除法)

COMPUTE_EYEDEPTH(o.projPos.z);//计算顶点距离相机的距离
//实际的计算#define COMPUTE_EYEDEPTH(o) o = -UnityObjectToViewPos( v.vertex ).z
//把顶点转化到视空间,取z值的负数就是真正的视空间距离了。

声明深度图

sampler2D _CameraDepthTexture;

片元着色器

//根据上面的屏幕空间位置,进行透视采样深度图(tex2dproj,即带有透视除法的采样,相当于tex2d(xy/w)),
//得到当前像素对应在屏幕深度图的深度,并转化到视空间,线性化(深度图中已有的不透明对象的深度)
float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));

//本像素点在视空间真正的距离(粒子本身的深度)
float partZ = i.projPos.z;

//计算二者的深度差,该值越小,说明越近穿插
float fade = saturate (_InvFade * (sceneZ-partZ));

LinearEyeDepth和Linear01Depth

原函数如下:

// Z buffer to linear 0..1 depth (0 at eye, 1 at far plane)
inline float Linear01Depth( float z )
{
return 1.0 / (_ZBufferParams.x * z + _ZBufferParams.y);
}
// Z buffer to linear depth
inline float LinearEyeDepth( float z )
{
return 1.0 / (_ZBufferParams.z * z + _ZBufferParams.w);
}

_ZBufferParams的含义如下:

float4 _ZBufferParams (0-1 range):

// Values used to linearize the Z buffer

x = 1-far/near

y = far/near

z = x/far

w = y/far

// or in case of a reversed depth buffer (UNITY_REVERSED_Z is 1)

//有些平台使用了Reverse-Z

x = -1+

获取场景中各点相对于摄象机的距离是计算机视觉系统的重要任务之一.场景中各点相对于摄象机的距离可以用深度图(Depth Map)来表示,即深度图中的每一个像素值表示场景中某一点与摄像机之间的距离.机器视觉系统获取场景深度图技术可分为被动测距传感和主动深度传感两大类.被动测距传感是指视觉系统接收来自场景发射或反射的光能量,形成有关场景光能量分布函数,即灰度图像,然后在这些图像的基础上恢复场景的深度信息.最一般的方法是使用两个相隔一定距离的摄像机同时获取场景图像来生成深度图.与此方法相类似的另一种方法是一个摄象机在不同空间位置上获取两幅或两幅以上图像,通过多幅图像的灰度信息和成象几何来生成深度图.深度信息还可以使用灰度图像的明暗特征、纹理特征、运动特征间接地估算.主动测距传感是指视觉系统首先向场景发射能量,然后接收场景对所发射能量的反射能量.主动测距传感系统也称为测距成象系统(Rangefinder).雷达测距系统和三角测距系统是两种最常用的两种主动测距传感系统.因此,主动测距传感和被动测距传感的主要区别在于视觉系统是否是通过增收自身发射的能量来测距。另外,我们还接触过两个概念:主动视觉和被动视觉。主动视觉是一种理论框架,与主动测距传感完全是两回事。主动视觉主要是研究通过主动地控制摄象机位置、方向、焦距、缩放、光圈、聚散度等参数,或广义地说,通过视觉和行为的结合来获得稳定的、实时的感知。我们将在最后一节介绍主动视觉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值