mfc 对话框透明 控件不透明_半透明与不透明物体相交的边界判断

本文探讨了如何处理半透明与不透明物体相交时的视觉效果,通过线性深度比较找到边界。在Unity中,通过渲染不透明物体并获取其深度,再与半透明物体的深度对比,可以实现如半球与圆柱交界处的紫色效果,以及河流与陆地交界的白沫和白浪效果。关键步骤包括不透明物体的深度写入、半透明物体的渲染以及线性深度差值的计算。

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

247a03ce2f8ec71cf23ae09bdf8596ba.png

对半透明与不透明物体相交部分进行一些效果处理也是比较常见的需求,在这里简单记录一下。

1.应用场景

  1. 下图中的半透明半球与不透明的圆柱,被圆柱穿过的边缘,半球会有紫色的效果。

3855d844fc57a4920a0531e60c374988.gif

2.下图中的右边半透明的河流与左边不透明的陆地,陆地边上的水会有边缘白沫和边缘白浪的效果。

c7edbb610c3be8bf2eba2ae8dd1f73a5.gif

2.原理

原理挺简单,想要实现上面提到的效果,就需要获得半透明和不透明物体相交的边界。所以用上面两个例子来说明。

  • 将场景中的所有不透明物体全部渲染出来并进行深度写入。于是得到下面两张图。

5b065613bc243ed12173f112207f004a.png
场景1中的不透明物体

54a3f37a2e9f465fe4316de580839774.png
场景2中的不透明物体
  • 渲染所有的半透明物体,例如场景1中的半球和场景2中的河流。由于目的是找到半透明物体和不透明物体的边界,常用的方法是通过线性深度来判断,通过比较场景中的半透明物体的线性深度与不透明物体的线性深度的差值,差值越小,越处于两者交界处。具体在Unity中,可以通过ComputeScreenPos获得齐次坐标系下的屏幕坐标值,范围是[0,w];再除以w之后,得到NDC下的屏幕坐标;再用这个坐标的xy逆变换到相机空间,对没有半透明物体的深度纹理进行采样并线性化,从而得到了不透明物体片元在相机空间的线性深度;然后对NDC下的屏幕坐标z值(半透明物体片元的非线性深度)线性化,得到半透明物体片元线性深度;最后,比较这两个线性深度的差值是否小于一个阈值即可找到边界。

4cddda4c268afc251f5720afdd00f75b.png
场景1中实现的交界处效果

5fb1442dabf776a8322a46632910d666.png
场景2中实现的交界处效果

3.示例代码

v2f 

这个代码只是为了说明前面讲的原理,代码最后的distanceDepth即为线性深度差值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值