atomsphere scattering almost final.

春节快到了. 最近的几个星期, 晚上一直窝在楼上的小黑屋里将atomsphere scattering 完成了. 

在尝试中, 我试过了http://etd.dtu.dk/thesis/58645/imm2554.pdf 的方法. 最后放弃了.

后来, 尝试了gpu gems 2 上的Chapter 16. Accurate Atmospheric Scattering . 但是
其性能不是我能接受的, 在GPU上进行积分, 虽然其除去了对光学深度: 

的积分. 仅仅用数值的方式来代替(the section : 16.4.1 Eliminating One Dimension), 但是对于inscattering 依然是有积分的.

基于性能的考虑, 我并不希望通过GPU来计算积分, 考虑一种情况, 如果散射的各种参数均没有变化的情况下, 那么整个天空到镜头的光学深度

应该就是一个可以预先计算的常量. 而且针对移动平台, 完全可以绕开GPU瓶颈, 在性能相对较好的CPU上进行异步并行运算, 将会更加高效. 

而且只会在太阳光方向或者散射参数发生改变时才会启动一次运算, 并将运算结果保存到2张查找纹理上.

在这部分的实现完成后, 我发现以前在atomsphere scattering中犯下的一个非常低级的错误!!!!!! 那就是我忽略了greestein 参数是可以调整的!!!!

而我居然根据论文, 将其自动计算了...... 

上图右侧: precomputed , 由于是预计算的, 仅仅只能对天空建立光学深度的查找表, 对于地表, 或者其它动态对象, 无法预计算, 所以看不到任何散射效果.  优点是, 能很直观地表现太阳的颜色. 

左侧, 武断地调整phase funcion 中的G 后, 我所想要的效果终于出来了~~~~~由于是post process 的, 而且根据场景深度, 可以近似获得地表等对象的光学深度, 并使其也被散射影响. (注意太阳附近的地表颜色). 缺点是.... 我不清楚...是不是我哪里还有疏忽的

地方. 总之, 太阳的颜色是额外计算的, 否则就一点都不明显.....

half3 Sun = SunColor.xyz * saturate(pow(max(Cos,0.0f),GreensteinArgs.w) * SunColor.w); 

 

性能差异上,两者差别不大 当然, 现在分析为时尚早, 两者或许都还能继续优化. 等我梳理清楚思路, 清理下代码后再来做比较, 现在的代码和SHADER非常混乱了, 整合了好多实现版本, 不同版本的积分公式...

 

WIP:

清理代码. 拆分成两部分独立实现. / 或者选定一部分实现. 

夜空, 不管是哪一种方式, 夜空都是不会有任何颜色, 靠近地表附近会有一些rayleigh 散射.  

 

posted @ 2015-02-12 11:31  访问异常  阅读(349)  评论(0编辑  收藏  举报