LumenScene direct lighting

LumenScene/Lighting
Lumen:

  1. LightCull: 前⾯买个cardpage划分为8X8⼤⼩的tile,然后以这个tile为单位对光源进⾏culling,得到对应光源影响的tile列表
  2. 后续就是shadowmask阶段:
    利⽤之前已经⽣成好的传统 Shadow Map和vsm ⽣成⼀遍 Shadow Mask:
    Distance Field Shadow ->Offscreen Shadows。
  3. lights:
    a. 这⾥和后续的lights最⼤的区别在于,区分了点光后,这⾥是 Attenuation = IntegrateLight(Capsule,
    LightData.bInverseSquared);算出线段也就是光源到点的线⻓的⼀个光衰,最后就是
    Irradiance = LightColor * (CombinedAttenuation * NoL * ShadowMaskRay.ShadowFactor);
    对⽐后续是 Lighting = IntegrateBxDF( GBuffer, N, V, Capsule, Shadow, LightData.bInverseSquared );⾥⾯涉及到了bxdf的计算。
  4. SSRT:
    Emmisive:
    这部分是通过trace到历史击中点,然后再去历史的scenecolor采样。不涉及到其他的数据结构
    RectLight:
    没直接联系
  5. 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更新了很多新东西,没时间去看,后面会去看看
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值