在大氣的渲染中,涉及到類
class FAtmosphericFogSceneInfo : public FRenderResource
{
};
它的光照相關成員函數是
/** Prepare the sun light data as a function of current atmospheric fog state. */
void PrepareSunLightProxy(FLightSceneInfo& SunLight) const;
調用該函數的是延遲渲染類
void FDeferredShadingSceneRenderer::Render(FRHICommandListImmediate& RHICmdList)
{
。。。。。。
if (ShouldRenderSkyAtmosphere(Scene, ViewFamily.EngineShowFlags))
{
for (int32 LightIndex = 0; LightIndex < NUM_ATMOSPHERE_LIGHTS; ++LightIndex)
{
if (Scene->AtmosphereLights[LightIndex])
{
PrepareSunLightProxy(*Scene->GetSkyAtmosphereSceneInfo(),LightIndex, *Scene->AtmosphereLights[LightIndex]);
}
}
}
else if (Scene->AtmosphereLights[0] && Scene->HasAtmosphericFog())
{
// Only one atmospheric light at one time.
Scene->GetAtmosphericFogSceneInfo()->PrepareSunLightProxy(*Scene->AtmosphereLights[0]);
}
.......
}
PrepareSunLightProxy()這塊相對比較複雜, 借鑑了寒霜引擎的物理渲染,大概意思是大氣系統的幾個因素,太陽位置影響了實時光照,天氣狀況影響到雲的變化。並涉及到了大氣散射,時間的變化也影響到了實時天空。
看看什麼時候用到這個延遲渲染,在FSceneRenderer::CreateSceneRenderer()中,
在往上走依次是FRendererModule::BeginRenderingViewFamily(FCanvas* Canvas, FSceneViewFamily* ViewFamily);
FEditorViewportClient::Draw(FViewport* InViewport, FCanvas* Canvas);