atomsphere scattering almost final.
2015-02-12 11:31
351 查看
春节快到了. 最近的几个星期, 晚上一直窝在楼上的小黑屋里将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 的, 而且根据场景深度, 可以近似获得地表等对象的光学深度, 并使其也被散射影响. (注意太阳附近的地表颜色). 缺点是.... 我不清楚...是不是我哪里还有疏忽的
地方. 总之, 太阳的颜色是额外计算的, 否则就一点都不明显.....
性能差异上,两者差别不大 当然, 现在分析为时尚早, 两者或许都还能继续优化. 等我梳理清楚思路, 清理下代码后再来做比较, 现在的代码和SHADER非常混乱了, 整合了好多实现版本, 不同版本的积分公式...
WIP:
清理代码. 拆分成两部分独立实现. / 或者选定一部分实现.
夜空, 不管是哪一种方式, 夜空都是不会有任何颜色, 靠近地表附近会有一些rayleigh 散射.
在尝试中, 我试过了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 散射.
相关文章推荐
- atomsphere scattering
- Ogre Atomsphere shader
- java -private,this,static关键字 和构造方法,final关键字
- Java中的final关键字详解
- Java中final的作用
- 局部内部类 局部内部类访问局部变量必须用final修饰
- 为什么一定要加final
- JAVA:类的三大特征,抽象类,接口,final关键字<3>
- final、finalize、finally
- day03_final
- final关键字的作用
- [转] Java中public,private,final,static等概念的解读
- 简单dp hdu 5532 Almost Sorted Array nlogn 的最长非严格单调子序列
- java final static 与final 修饰变量的区别
- Java中的内存处理机制和final、static、final static总结
- Java final
- 构造器中可要调用本类的方法,但要调用的非static方法必须声明为private或final
- java中final,finally,finalize,static浅析
- 为何String对象是immutable或final的?