Variance Shadow Maps
来源:互联网 发布:河南省保险数据 编辑:程序博客网 时间:2024/05/17 21:46
1.Shadow Mapping
Shadow mapping是一种two pass的阴影算法,首先从光源的视角渲染出一张深度图depthMap;然后再从camera的角度渲染整个场景,把每一个pixel都投影到depthMap中,然后和depthMap texel中的深度去比较,判断当前pixel是否在阴影中。Shadow mapping的算法是逐像素级的,因此会在边缘留下锯齿的走样痕迹;Shadow mapping算法产生的是一种硬阴影,没有半阴,阴影到非阴影的过渡不真实。Donnelly和Lauritzen就提出了一种阴影软化的方法。
2. Variance Shadow Maps
Variance Shadow Maps算法和标准的Shadow Mapping算法很接近,Variance Shadow Maps算法把depth和depth²存储在depthMap中,然后在特定的区域滤波,获得了深度分布在区域的一阶和二阶矩:
从
通过应用切比雪夫不等式,可以得出随机变量x大于当前深度值t的一个概率上限:
这个概率可以看做比率,表示光照射到当前像素的比率,可以直接用在渲染方程中,避免了像素被完全照亮。在计算概率时,为了避免一些数值问题最好给方差一下下限,下面是计算概率的片元着色器代码:
float chebyshevUpperBound(float distance,vec2 texCoord){ vec2 moments = texture(shadowMap,texCoord).rg; //片元不在阴影里 if (distance <= moments.x) return 1.0; //计算片元在阴影里的最大概率上届 float variance = moments.y - (moments.x*moments.x); variance = max(variance, 0.00002); float d = distance - moments.x; float p_max = variance / (variance + d*d); return p_max;}
2.1 Biasing
Variance shadow map针对shadow biasing问题提供了一种优雅的解决方法,使用二阶矩来表示每个像素上深度的变化范围,考虑每个像素上深度在各个方向的范围复杂度比较高,仅仅考虑在局部平面上的分布,由一下参数方程表示:
当光线和面垂直的时候上述公式就变成了深度的平方,通过opengl自带的偏导数函数可以很容易的计算出
in vec4 v_position;out vec4 outColor;void main() { float depth = v_position.z / v_position.w; depth = depth * 0.5 + 0.5; float moment1 = depth; float moment2 = depth * depth; float dx = dFdx(depth); float dy = dFdy(depth); moment2 += 0.25*(dx*dx+dy*dy); outColor = vec4( moment1, moment2, 0.0, 0.0);};
2.2 Light Bleeding
Variance shadow maps的一个潜在问题就是光线渗透问题,即在场景的遮挡关系比较复杂的时候软阴影出现的位置错误,如下图的红圈所示:
出现这个问题是由于切比雪夫不等式计算的只是一个概率上界,并不是精准的概率,从切比雪夫不等式可以得出只有当红色区域的深度值远远大于对应depth中的
2.3 Numeric Stability
在存储depth和depth²的时候最好使用线性的深度值,而不是opengl默认的深度值,当光源距离场景非常远时depth和depth²的精度损失非常大,使得方差的计算变得不稳定,使用线性的深度值,精度的损失与光源到场景的距离无关,方差的计算更加稳定。因此最后使用光源空间的深度值。
实现代码
基于opengl的实现代码
- Variance Shadow Maps
- 译Variance Shadow Maps
- Variance Shadow Maps
- Layers Variance Shadow Map
- Layered-->Variance-->Shadow Map
- Layered-->Variance-->Shadow Map
- Variance Shadow Mapping(译)
- Variance Shadow Mapping
- Reflective Shadow maps
- Cascaded Shadow Maps
- Better shadow maps
- Implementing Shadow Maps on Mainstream Graphics Hardware
- Common Techniques to Improve Shadow Depth Maps
- Common Techniques to Improve Shadow Depth Maps
- Variance
- Variance
- Variance
- [gpu pro3]efficient online visibility for shadow maps
- 单例模式
- 线性表的顺序存储
- leetcode 9. Palindrome Number
- 全面了解 Nginx 主要应用场景
- Kotlin_null安全
- Variance Shadow Maps
- 常见的PHP安全防范
- 应用程序无法正常启动(0xc0000007b),问题修复
- 【python可视化】python 画饼图,柱状图,折线图,条形图
- 灰度变换_MATLAB
- 学0-1背包算法的个人理解
- Unity CSV文件加载案例
- 优秀程序员必须知道的32种算法
- thinkphp5 + postgresql 在插入数据时无法获取新增记录ID