LumenScene/Lighting
Lumen:
- LightCull: 前⾯买个cardpage划分为8X8⼤⼩的tile,然后以这个tile为单位对光源进⾏culling,得到对应光源影响的tile列表
- 后续就是shadowmask阶段:
利⽤之前已经⽣成好的传统 Shadow Map和vsm ⽣成⼀遍 Shadow Mask:
Distance Field Shadow ->Offscreen Shadows。 - lights:
a. 这⾥和后续的lights最⼤的区别在于,区分了点光后,这⾥是 Attenuation = IntegrateLight(Capsule,
LightData.bInverseSquared);算出线段也就是光源到点的线⻓的⼀个光衰,最后就是
Irradiance = LightColor * (CombinedAttenuation * NoL * ShadowMaskRay.ShadowFactor);
对⽐后续是 Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, LightData.bInverseSquared );⾥⾯涉及到了bxdf的计算。 - SSRT:
Emmisive:
这部分是通过trace到历史击中点,然后再去历史的scenecolor采样。不涉及到其他的数据结构
RectLight:
没直接联系 - SDF:
这部分是通过SampleLumenMeshCards来获取,本质最后都是
来获取
Emmisive其实和RectLight⼀样
这⾥的区别是,如果是rectlight,那么lumenscene⾥会注⼊直接间接光,再加上空⽩的Emmisve构建出最终的finallighting. 如果
是Emmsive,那么就是lumenscenelighting注⼊空⽩的直接间接光(因为没有光),再加上有内容的Emmisive构建出最终的Final
lighting。
lumen软trace采样的时候,都是采样finallighting。特殊情况(⽬前看只有硬件追踪)可能会去采样不带emmisive和albedo的
Direct/IndirectLighting。
Voxel:
这⾥的voxellighting是在lumenscenelighting⽣成的,它的光照注⼊流程也是通过
⽤于采样出⾃⼰的voxellighting数据
所以和上⾯的meshsdf⼀样
直接光AtLas:
1.⾯光:
1 FRect Rect = GetRect(ToLight, LightData);
2 FRectTexture RectTexture = InitRectTexture(DeferredLightUniforms.SourceTexture);
3 Attenuation = IntegrateLight(Rect, RectTexture);
这⾥的Getrect是物理层⾯获取⾯,然后会去⾛Rectlight的IntegrateLight。
这⾥的Ingegratelight⾸先会 float3 L = RectIrradianceLambert( 0, Rect, Falloff, NoL )算出⼀个平均的光线⼊射⽅向(没看懂,得
再看看),这个如果有需要可以后续再去了解。
最后再去SampleSourceTexture去算出光的衰减,这⾥应该是⽤了sourcetexture的mask
2.点光就是:
其实就是将点光数据赋值给点光结构
后续就是根据前⾯⼀步⽣成的2个位置去算点光的光衰
确定了光衰后,如果⼤于0
它会根据光的⽅向L Dot 对应的NormalAtlas采样出来的WorldNormal得到⼀个值NoL
Irradiance = LightColor * (CombinedAttenuation * NoL * ShadowMaskRay.ShadowFactor);
ShadowMaskRay.ShadowFactor 这个值是前⾯计算出来的
间接光atlas
它⾸先会去构建radiositytile,将surfacecache上的cardpage划为tiles。
然后就是去做distandfieldtracing,采样的是voxellighting。它在这⾥是根据前⾯⽣成的tile,每个tile放置2x2的probe,probe对应
的是4x4的texel,所以是16次conetracing
后续就是滤波/积分
这⾥没有点光和⾯光区别
Emissive: OutTarget2 = float4(GetMaterialEmissive(PixelMaterialInputs) * GetMaterialTGEmissiveLumen(), 0.0f);
Light: ⼀个Irradiancecache的过程。
据说5.2Lumen更新了很多新东西,没时间去看,后面会去看看