您当前的位置: 首页 >  ar

Jave.Lin

暂无认证

  • 2浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity Shader - Ray Marching - T7 - AO

Jave.Lin 发布时间:2020-04-29 22:09:33 ,浏览量:2

文章目录
  • 运行效果
    • 单纯AO光照遮蔽值
    • 无AO
    • 有AO
  • Project
  • GGB
  • Excel
  • References

自学Raymarching汇总:Unity Shader - Ray Marching Study Summary - 学习汇总

说个题外话,今天面试虽然没成功了,让自己发现更多的问题。 但收获非常的大,让我调整得更好的方向。 真的非常感谢这位面试官!

此篇为Raymarching告一段落的文章,后续如果有时间会更加深入。 因为要去开始进修对的方向的内容,可能时间需要挺长的。

生活就是这样子,不可能什么都一帆风顺。 生活只会给你更沉重的打击,每个人都一样,就看个人的心态如何调整,应对。

发现很多实现在Raymarching里都非常的简单与直白。

之前看过一下AO的内容,虽然知道AO是指:Ambient Occlusion,环境遮蔽。

然后生成的方法也大概了解一丢丢,但从来没去实践过。

就是对需要计算AO的表面,计算它的指定半径范围内有无东西靠近,越多东西靠近,往往AO就越高,就环境光量的辐射就遮蔽越多。

根据之前知识点的累计,就画一张示意图: 在这里插入图片描述

如上图,假设要计算某个微表面的点P的AO值,我们按一定的角度平分了AO采样计算的射线。 我们一共发射了12条AO射线。红色点的说明该点P附近有阻挡物,或是有几何体;绿色的说明这个AO射线上没有阻挡物。

可以看到12条中,有9条检测有阻挡物,只有3条检测是没有阻挡物的。 所以他的AO值为: A O p = 9 12 AO_p=\frac{9}{12} AOp​=129​,最后应用该值到着色只要:col *= 1 - AO; 1-AO取反一下就好,或这我们在计算AO值的时候直接统计:3条未检测有阻挡物的比例值,即: A O p = 3 12 AO_p=\frac{3}{12} AOp​=123​,后续我们就以取检测到没有阻挡的比例值作为AO着色因子吧。

但是上面的这种算法有一些问题。再来看看另一种情况,如下图: 在这里插入图片描述 如上图所示,采样计算点P的AO值,有阻挡的6条射线,无阻挡也是6条。

那么6条无阻挡的AO结果为: A O p = 6 12 = 1 2 = 0.5 AO_p=\frac{6}{12}=\frac{1}{2}=0.5 AOp​=126​=21​=0.5

所以就连平躺微表面的指定半径范围无其他阻挡物有也0.5的AO值,那乘到着色点上:col *= AO; => col *= 0.5; 可就整体让颜色变暗了。

一块绝对的平面没有其他阻挡光线的东西,应该是最大限度的接收光的,但结果却有AO值,这不是我们想要的结果。

所以我们用另一种方案:只发射法线方向半球内的AO射线。

如下图: 在这里插入图片描述 如上图,我们只对平面半球范围内发射AO射线,一共6条,一个阻挡物都没有,AO值基本就是1了,应用到着色:col *= AO; => col *= 1;,AO因子为1,应用到着色去,就是不改变任何颜色。

这结果证实我们想要的。

好了,上面就是我自己学习后总结的AO的基本 模拟 计算方法。

从上面的算法可得知,要想获取AO值,得要有全局的几何信息,这样才可以检测这个点附近有无阻挡物。

如果在 光线追踪 或是 光栅化渲染器 我们需要先使用BVH,或是OT树来剔除几何体,再生产多条射线去检测,射线的数量与精准度成正。

但要是在 Raymarching 中我们只要控制AO射线步进次数即可。

也不需要半球什么的,因为算法就是按法线方向去步进检测全局距离场的。

float calcAO( in vec3 pos, in vec3 nor )
{
	float occ = 0.0;
    float sca = 1.0;
    for( int i=0; i            
关注
打赏
1664331872
查看更多评论
0.0403s