unity code-probe

球谐九个值的计算:

在LightManager::FindForwardLightsForObject中无论执行CrossBlendForwardLights或者函数本身都会计算AddLightToSH,这里就是球谐的九个值计算的部分。

SphericalHarmonics.h这里是球谐函数的计算类。

首先要确定是直线光还是其他光线,如果是直线光就只看旋转方向,如果是其他光线需要知道距离和旋转。

光线强度:

CalculateLightColorAtPointForSH这里主要是根据直线光或者其他光源去计算颜色和强度的乘积,当然如果是线性空间要转一下。

计算3阶:

计算出光照颜色后就加入到SHEvalDirectionalLight9计算9个球谐值。在SHEvalDirectionalLight9中的SHEvalDirection9是根据球谐公式计算出九个球谐值并记录。

扫描二维码关注公众号,回复: 13718895 查看本文章

最终这九个值还要乘缩放,然后存起来。

最终存在lights->sh中。

纠正第一维的系数:

这个无论运行时还是烘焙的时候都会执行。

在LightManager::FindForwardLightsForObject中通过GetLightProbes()->GetInterpolatedLightProbe来获取lightprobe的数据。在PrePassRenderLoop::RenderFinalPass中也可以通过lightProbes->GetInterpolatedLightProbe来更改sh中第一维的所有对象的值,这样可以更精确。

预估:

然后会执行到LightProbes::GetInterpolatedLightProbe,m_Data是probe的数据结构,m_Data.tetrahedra是四面体,只有有这个数据才认为有probe。然后执行GetLightProbeInterpolationWeights来获取四面体的索引tetIndex。这里用的是预估的方式,也就是看权重正确的就返回索引。

质心坐标

会遍历所有的四面体,通过GetBarycentricCoordinates来获取质心坐标。如果四面体的索引大于等于三也就是在四面体内部的点则用GetBarycentricCoordinatesForInnerTetrahedron来获取,在外部的点就用GetBarycentricCoordinatesForOuterCell。

如果是内部的则比较简单,获取四面体的权重信息就好了。如果是外部就要用翘曲棱柱体来获取的。

权重判断

只要权重都大于0则获取到就返回。不然就要获取周边的信息来补充。

赋值给renderer以及探针插值:

最终获取到tetIndex后给到renderer,以及用InterpolateLightProbeCoefficients来使用权重对探针进行实际插值并获得系数。

赋值给light:

然后在LightManager::FindForwardLightsForObject或者PrePassRenderLoop::RenderFinalPass中赋值给灯光的球谐(lights->sh)

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/123038404