(八)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案)

一、探针基于球谐函数的全局光照

球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术。预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果。这种技术通过在运行前对场景中光线的相互作用进行预计算,计算每个场景中每个物体表面点的光照信息,然后用球谐函数对这些预计算的光照信息数据进行编码,在运行时读取数据进行解码,重现光照效果

球谐光照使用新的光照方程来代替传统的光照方程,并将这些新方程中的相关信息使用球谐基函数投影到频域,存储成一系列的系数。在运行渲染过程中,利用这些预先存储的系数信息对原始的光照方程进行还原,并对待渲染的场景进行着色计算。这个计算过程是对无限积分进行有限近似的过程。

简单说,球谐光照的基本步骤就是把真实环境中连续的光照方程离散化,得到离散的光照方程,然后对这些离散的光照方程进行分解,分解后进行球谐变换,得到球谐系数,在运行时根据球谐系数重新还原光照方程。

关于球谐函数的数学公式推导,后面有空会补上这块内容。

总结下球谐光照操作过程:

为了求得原始光照计算函数light(s)的积分结果,选用若干组基函数Bi(s)和这些基函数对应的加权系数ci,将个组基函数和加权系数相乘,然后累加乘积值,这个累计值就近似等于原始函数light(s)z的积分结果。Bi(s)就是球谐函数,而ci则未知待求得。采样若干个自变量si,得到每一个自变量si对应的原始计算函数和基函数乘积,再累加可得到ci。最后便可以求得原始光照计算函数积分近似计算结果。

二、Unity3D中的球谐光照

Unity3D内置shader库中定义了一些工具函数,可以计算球谐光照。使用了3阶的伴随勒让得多多项式作为基涵,即l的最大取值为2。直角坐标系下3阶球谐函数的系数如下所示,共9个,其中r=根号下x方+y方+z方。

最终的光照函数就是上表中每一项Y和基函数系数c的叠加,又因为球谐光照所讨论的球面空间是在一个单位球空间中的,所以上表的r项的值为1,故而在考察的单位球球面上的位置点(x,y,z)组成的向量也是一个单位化的向量。

在重建光照过程中,因为使用的光照颜色是RGB颜色,每一个分量都需要和这9个系数进行运算操作,并且因为每个光颜色分量使用的波长不同,所以对应的c也不同。因此需要27个数字去做这些操作,这27个数字存储在7个float4变量中,这7个float4变量再文件中定义,由引擎在程序运行时传递进来。

2.1球谐光照要用到的系数

 // SH lighting environment
    half4 unity_SHAr;
    half4 unity_SHAg;
    half4 unity_SHAb;
    half4 unity_SHBr;
    half4 unity_SHBg;
    half4 unity_SHBb;
    half4 unity_SHC;

上述代码中,unity_SHAr的3个分量对应于表中l=1的各项Y的红色光分量对应的c的乘积,最后一个分量对应于l=0时Y常数值与对应的c的乘积,unity_SHAg对应于绿光分量;untiy_SHAb对应于蓝光分量。

2.2 SHEvalLinearL0L1函数

// normal should be normalized, w=1.0
//传递进来的normal参数是一个单位化的half4类型的向量,其w分量为=1.0
//即单位球面的一点,又可视为从单位球圆心到这一点的连线的向量
half3 SHEvalLinearL0L1 (half4 normal)
{
    half3 x;

    // Linear (L1) + constant (L0) polynomial terms
	//因为normal.w的值为1,所以unity_SHAr最后一项与normal.w的乘积和传进来的球面上的点的位置没有关系,这一项是重建光照效果时,l=0时的多项式Y(m,l)的值
    x.r = dot(unity_SHAr,normal);
    x.g = dot(unity_SHAg,normal);
    x.b = dot(unity_SHAb,normal);

    return x;
}

实质上就是把每个待计算的球面上的某个点传递给分别执行表中l=1时的各项多项式进行计算操作,得到各项的乘积之后,再叠加起来返回。这也是在此使用''各分量先各自相乘最后相加“的点积函数的原因。

2.3 SHEvalLinearL2函数

函数功能是计算l=2时的各个对应值。

// normal should be normalized, w=1.0
half3 SHEvalLinearL2
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值