~プログラミング~ DirectX 11で環境反射 (Ambient reflection)

C++言語でDirectX 11を使ったアプリケーションを開発してみよう。

今回はライティングの手法の一つ環境反射についてまとめてみようと思います。

環境反射 (Ambient reflection)

拡散反射鏡面反射は物体に対して直接光が当たった面を計算します。この為裏側になる面については真っ暗になります。ですが現実世界では壁などに反射した光が物体の裏側もわずかながらに照らす事で、真っ暗にはならなかったりします。

 

このような2次的な反射までを真面目に計算しようとすると膨大な計算量となってしまいます。

 

そこで2次的な反射を補完する為に、物体に対して全方位から一定量の光が当たっているものとして計算しようというのが環境反射になります。

計算式にすると以下のようになります。

 

I = A * IA

 

面の色Aと環境光の輝度Aを掛け合わせて求めます。

面の向きや光源の方向などは必要ありません。

ピクセルシェーダー

上記の計算をHLSLで書くとこんな感じになります。

struct PS_IN
{
    float4 pos  : SV_POSITION;
    float4 posw : POSITION0;    //ワールド座標系の座標
    float4 norw : NORMAL0;      //ワールド座標系の法線
};

cbuffer ConstantBuffer
{
    float4 lightAmbient;      //環境光
    float4 materialAmbient;   //物体の色
}

float4 ps_main( PS_IN input ) : SV_Target
{
    float3 i;

    i = materialAmbient.xyz * lightAmbient.xyz;
    return float4(i, 1.0);
}