C++言語でDirectX 11を使ったアプリケーションを開発してみよう。
今回はライティングの手法の一つ環境反射についてまとめてみようと思います。
環境反射 (Ambient reflection)
拡散反射や鏡面反射は物体に対して直接光が当たった面を計算します。この為裏側になる面については真っ暗になります。ですが現実世界では壁などに反射した光が物体の裏側もわずかながらに照らす事で、真っ暗にはならなかったりします。
このような2次的な反射までを真面目に計算しようとすると膨大な計算量となってしまいます。
そこで2次的な反射を補完する為に、物体に対して全方位から一定量の光が当たっているものとして計算しようというのが環境反射になります。
計算式にすると以下のようになります。
I = KA * IA
面の色KAと環境光の輝度IAを掛け合わせて求めます。
面の向きや光源の方向などは必要ありません。
ピクセルシェーダー
上記の計算を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); }
- ~プログラミング~ DirectX 11を始めよう
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その1
- ~プログラミング~ DirectX 11はDirectX 9と何が違うか その2
- ~プログラミング~ DirectX 11の初期化をしよう その1
- ~プログラミング~ DirectX 11の初期化をしよう その2
- ~プログラミング~ DirectX 11で深度/ステンシルバッファを準備しよう
- ~プログラミング~ DirectX 11でシェーダーをコンパイルしよう
- ~プログラミング~ DirectX 11で三角形を表示しよう
- ~プログラミング~ DirectX 11の頂点バッファとインデックスバッファ
- ~プログラミング~ DirectX 11で立体を表示しよう その1
- ~プログラミング~ DirectX 11で立体を表示しよう その2
- ~プログラミング~ DirectX 11で平行光源ライティング
- ~プログラミング~ DirectX 11で点光源ライティング
- ~プログラミング~ DirectX 11で拡散反射 (Diffuse reflection)
- ~プログラミング~ DirectX 11で鏡面反射 (Specular reflection)
- ~プログラミング~ DirectX 11で環境反射 (Ambient reflection)
- ~プログラミング~ DirectX 11でフォン反射モデル
- ~プログラミング~ DirectXTexライブラリを導入しよう
- ~プログラミング~ DirectX 11でテクスチャマッピング
コメントをお書きください