【OpenGL】使用随机采样实现soft shadow

本篇文章主要针对《OpenGL 4 Sharding Language Cookbook》一书中第七章——Shadow的第四节Creating soft shadow edges with random sampling解释而得。


-----------------------------------------------------------------分割线-------------------------------------------------------------



锯齿问题(aliasing)

基于shadow map实现阴影效果有很多不是那么令人满意的地方,其中一个就是锯齿问题(aliasing)。出现锯齿的原因是因为shadow texture的大小往往小于屏幕大小,当把shadow texture渲染到屏幕上时,那些多余的像素就会显现出来锯齿。

最基本的shadow map的思想,我想大家都知道,就不说了。它在最后会根据shadow texture上的深度值来判断当前要渲染的fragment是否在阴影里,如果是,那么它的visibility为0,否则就是1。这样0和1的突变在图像边缘处就表现为锯齿。


PCF方法

为了解决这个问题,一种通常的方法是使用PCF(percentage-closer filtering)。它的基本思想就是避免visibility从0到1的突变,它的基本实现是,当把某一fragment转换到阴影空间(也可以说是shadow texture上对应的某一个像素)时,visibility的取值由以该像素为中心的某一区域内一些采样点的visibility乘以它们的相对于中心点的百分比来决定的。当这个区域越大,采样点越多,它的边缘模糊效果就越好。通常简单的实现是,在生成shadow texture的时候采用线性插值,并在渲染时判断某fragment是否在阴影中时,对其在shadow texture上对应的像素的周围固定的若干像素(如取其左上、右上、左下、右下四个像素)进行采样,最后取平均值来模拟实现soft shadow。

但这个方法有几个缺点,一个是得到的边缘的blur效果不是那么明显,它是以采样区域的大小和采样点的数目决定的,但这势必会带来性能上的下降;另一个是对于一些完全在阴影里或者完全在阴影外面的点来说,这

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值