- 运行效果
- 单纯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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?