/
7.3.2. スカイライトのイラディアンス

This is the documentation for Enlighten.

7.3.2. スカイライトのイラディアンス


実行時に Enlighten イラディアンス出力のみを計算しながら、法線に応じて変化するという優れたシェーディングを作成する方法の 1 つに、プリコンピュートによって生成される固定ラジオシティ法線テクスチャの使用が挙げられます。

これを行うには、ハーフ ランバート フォールオフを使い、間接イラディアンス イルミネーションをイラディアンス法線方向から来る光としてモデル化します。次に、ラジオシティ法線と反対方向を向くジオメトリのスカイライト項を追加で戻します。

ディレクショナル イラディアンスモデルの近似コンポーネントは、入射するバウンス光がハーフ ランバート フォールオフで計算されるという点では似ていますが、入射の方向が固定されておらず、ディレクショナル テクスチャから読み取られます。

これは、屋外の都市の景観などのシーンに適しています。ラジオシティ法線と反対を向く詳細なジオメトリ (レッジや窓枠など) が存在し、それらがイラディアンス計算に含まれない空から追加で光を受ける場合などです。

float3 GetIrradiance(float2 uv, float3 normal)
{
    float3 irradiance = tex2D(g_IrradianceSampler, uv).xyz;
    float4 radiosityNormalTextureValue = tex2D(g_RadiosityNormalSampler, uv);
 
    // ラジオシティ法線テクスチャの w チャネルが「スカイライト係数」です - その地点で
    // 環境のうちどの程度が視認できるかを示します。
    float skylightFactor = radiosityNormalTextureValue.w;
         
    // ラジオシティ法線をリスケーリングします ([0,1] の値をとる 8888 テクスチャから
    // くるため)。
    float3 radiosityNormal = radiosityNormalTextureValue.xyz * 2.0f - 1.0f;
 
    // 半球ライティング係数のライティングの計算です。
    // ライトは「上」方向で空の色、「下」方向で黒です。
    float3 hemispherical = (dot(normal, g_SkylightUp) * 0.5f + 0.5f) * g_SkylightColour * skylightFactor;
 
    // イラディアンス法線方向に沿って入射する
    // 「イラディアンス ライト」のハーフ ランバート項を計算します。
    float4 tau = float4(radiosityNormal.xyz, 1.0f) * 0.5f;
    float dotI = dot(tau, float4(normal, 1.0f));
 
    // イラディアンス ライトとスカイライトを組み合わせ、クランプします。
    return max(float3(0.0f, 0.0f, 0.0f), dotI * irradiance.xyz + (1.0f - dotI) * hemispherical * g_SkylightColour);
}

Related content