我目前正在嘗試了解虛幻引擎中的IBL,關於該公式有很多事情我不了解。虛幻通過進行分割和近似來近似陰影方程的鏡面反射項。
這是虛幻如何對鏡面照度項的環境貼圖進行預過濾。
float3 PrefilterEnvMap(float Roughness, float3 R )
{
float3 N = R;
float3 V = R;
float3 PrefilteredColor = 0;
const uint NumSamples = 1024;
for(uint i = 0; i < NumSamples; i++ )
{
float2 Xi = Hammersley( i, NumSamples );
float3 H = ImportanceSampleGGX( Xi, Roughness, N );
float3 L = 2 * dot ( V, H ) * H - V;
float NoL =saturate( dot ( N, L ) );
if ( NoL > 0 )
{
PrefilteredColor += EnvMap.SampleLevel( EnvMapSampler, L, 0 ).rgb * NoL;
TotalWeight += NoL;
}
}
return PrefilteredColor / TotalWeight;
}
我的問題是為什麼總重量是飽和的總和(點(N,L))。我對重要性抽樣的理解是,我們應該將抽樣與用於抽樣的pdf分開。在這種情況下,根據我在here上看到的內容,pdf應該是
$$ p_i(wm,wo)= \ frac {D(wm)(wm \ cdot wg)} {4 | wo \ cdot wm |} $$