BasicEffect
BasicEffectとは
XNAはShader Model 1.1以上のビデオカード向けに設計されていて、固定シェーダーが使えません。これは、昨今のゲームのグラフィクスにはシェーダープログラムが欠かせなくなっていること、DirectX 10でも固定シェーダーが廃止されたことが主な理由です。また、仮に固定シェーダーをサポートした場合、設計思考が違うものを一緒にすることによるライブラリの複雑化、マルチテクスチャの細かい部分の振る舞いがGPUによって違い、しかもその情報量が少ないという問題もあります。
以上の理由から、XNAではシェーダプログラムが使える事が前提となっています。しかし、いきなりシェーダープログラムを書くというのでは敷居が高すぎるので、固定シェーダーの代表的な機能を簡単に使えるようにしたのがBasicEffectクラスです。
BasicEffectには以下の機能があります。
- ライティング
- マテリアル(DiffuseColor、SpecularColor、EmissiveColor)
- 3つの鏡面光(Specular)つき平行光源(Directional Light)
- テクスチャ(シングルレイヤーのみ)
- 頂点カラー
- フォグ(視点からの距離によるもの)
これらの機能をコントロールするために、BasicEffectにはLightingEnabled、TextureEnabled、VertexColorEnabled、そしてFogEnabledプロパティがあります。ここで重要なのは、これらのプロパティを変更した場合、BasicEffectは使用するシェーダーを切り替え、特に最初の3つプロパティによって頂点シェーダー内で参照する頂点データが変化するということです。以下は各プロパティと頂点データの対応表です。
プロパティ | 対応する頂点データ |
LightingEnabled | VertexElementUsage.Normal |
TextureEnabled | VertexElementUsage.TextureCoordinate |
VertexColorEnabled | VertexElementUsage.Color |
頂点データに対応するデータがない場合、例えばLightingEnabledをtrueにしたのに指定した頂点データにNormalが含まれていない場合の動作は未定義となっています。特にDirectX SDKを入れてデバッグモードにしている環境では例外処理が発生するので、自分のところでは動いていても、友達のPCだと動かなかった、なんてことになってしまうので注意が必要です。
これらのプロパティは全て既定値がfalseとなっています。ですから、BasicEffect.Textureにテクスチャをセットしただけではテクスチャが表示されないので、テクスチャを使う時はBasicEffect.TextureEnabledをtrueにすることでテクスチャが表示されます。
BasicEffectで簡単ライティング
XNAで初めて3Dプログラムを始める人にはもちろん、3Dプログラムに慣れている人でもライティング設定は面倒な作業です。この作業を軽減する為に、BasicEffect.EnableDefaultLightingというメソッドがあります。このメソッドを呼ぶことで以下のライティング設定が適用されます。
名前 | 色 | 方向 | スペキュラ |
キーライト | 左奥、下方 | あり | |
フィルライト | 右手前、上方 | なし | |
バックライト | 右手前、下方 | あり |
このキー、フィルそしてバックライトの3つの光源を使うのがライティングの基礎になり、実際に映画やドラマなどではこれらを基本としたライティングが使われています。暗いシーンで効いてくるのが、被写体の輪郭を背景から浮かび上がらせる効果のあるバックライトです。以下の2枚のスクリーンショットは実際にGSEで撮ったもので、左がキーライトのみ、右がキー、フィル、そしてバックライトの3つを使ったものです。
左側のスクリーンショットでは、機体の下の部分が背景に溶けこんでしまっているのに対して、右側ではシルエットがハッキリとしていて、機体の丸みが判り、より立体的に見えます。
ライティングはそれだけで本が書けるくらい奥が深いのですが、EnableDefaultLightingを使うことで簡単にライティング効果を得ることができるので、試しに使ってみるのはどうでしょうか?