Unity Shader - Ray Marching - T7 - AO

49 篇文章 0 订阅
9 篇文章 2 订阅

自学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<5; i++ )
    {
        float h = 0.001 + 0.15*float(i)/4.0;
        float d = map( pos + h*nor );
        occ += (h-d)*sca;
        sca *= 0.95;
    }
    return clamp( 1.0 - 1.5*occ, 0.0, 1.0 );    
}

上面的代码可参考:https://www.shadertoy.com/view/lsKcDD

在Excel来演算一下各种情况
在这里插入图片描述

运行效果

单纯AO光照遮蔽值

在这里插入图片描述

无AO

在这里插入图片描述

有AO

在这里插入图片描述

Project

GGB

Excel

References

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值