计算用于阴影剔除的包围体(shadow culling volume)

 我们在做剔除的时候一般要用到视锥,用视锥的6个平面作为裁剪平面。但是对于渲染shadow map的时候
是不能直接使用视锥做剔除的,因为视锥外的物体是有可能将阴影投射到视锥里的。这时我们需要一个专门
用于阴影剔除的包围体(culling volume)
那么如何构造这个包围体呢。我们将视锥向光源方向投影,可以得到一个凸多边形的轮廓。
轮廓上的每条边都对应于视锥上的一条边,我们将视锥从这些边处切成两半,将上半部沿光源方向无限拉长,
构成一个新的,被拉长的包围体。再将上半部分这个“盖子”去掉,最终得到的一个非封闭的,
长筒状的东西就是我们需要的包围体了。任何可能将阴影投进视锥的物体都不会被包围体裁掉。
这个过程有点类似shadow volume的计算,只是shadow volume没有去掉“盖子”的过程。


代码

// 判断两个平面的交线是否是轮廓线
int TestSilhouette(const Plane& p0, const Plane& p1, const Vector3& dir)
{
	float t0 = p0.m_Normal.Dot(dir);
	float t1 = p1.m_Normal.Dot(dir);
	if (t0 * t1 > 0.0f)
	{
		return 0;
	}

	return t0 > 0.0f ? 1 : 2;
}



// 算法:根据光源方向计算视锥体的轮廓线,由轮廓线和光源方向构造包围平面
// 包围平面过轮廓线且与光源方向平行
void CreateLi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值