ビルトイン・エフェクトの組み合わせとパフォーマンス
私のMIXでのトークから拝借して、XNA Game Studio 4.0の五つのビルトイン・エフェクトと、その最適化のための組み合わせの情報をまとめて紹介します。
簡単に言えば、シェーダー命令数が少ないほど実行速度が速くなります。ただし、CPUバウンドだったり、GPUの別の部分がボトルネックの場合は効果がないことに注意してください。
BasicEffect
頂点シェーダー | ピクセルシェーダー | |
LightingEnable = false | 5 | 1 |
頂点ライティングx1 | 40 | 1 |
頂点ライティングx3 | 60 | 1 |
PreferPerPixelLighting = true | 18 | 50 |
頂点ライティングx1になるのは、パラメーターが以下の組み合わせの時です:
- LightingEnable = true
- PreferPerPixelLighting = false
- DirectionalLight0.Enabled = true
- DirectionalLight1.Enabled = false
- DirectionalLight2.Enabled = false
以下の設定によって、前述の命令数に加えて以下の命令数が追加されます。
頂点シェーダー | ピクセルシェーダー | |
TextureEnabled = true | +1 | +2 |
FogEnabled = true | +4 | +2 |
SkinnedEffect
ライティングの構成によって主に三つの組み合わせがあります。
頂点シェーダー | ピクセルシェーダー | |
頂点ライティングx1 | 55 | 4 |
頂点ライティングx3 | 75 | 4 |
PreferPerPixelLighting = true | 33 | 51 |
これらはWeightsPerVertex = 1の時の値です。規定値は4で、ModelProcessorの振る舞いと一緒です。少ないウェイト数で正しく動作させるためには正しい頂点データになっている必要があります。ちょい技: WeightsPerVertex = 1の設定にしたSkinnedEffectを使うと、インスタンシングを実装することができます。
そして、以下は設定による追加命令数です。
頂点シェーダー | ピクセルシェーダー | |
WeightsPerVertex = 2 | +7 | +0 |
WeightsPerVertex = 4 | +13 | +0 |
FogEnabled = true | +0 | +2 |
BasicEffectと違ってSkinnedEffectの場合は、ライティングなしや、テクスチャなしの設定をすることはできません。
EnvironmentMapEffect
EnvironmentMapEffectにはライティングの設定によって以下の二つの組み合わせがあります。
頂点シェーダー | ピクセルシェーダー | |
頂点ライティングx1 | 32 | 6 |
頂点ライティングx3 | 36 | 6 |
以下は設定による追加命令数です。
頂点シェーダー | ピクセルシェーダー | |
FresnelFactor != 0 | +7 | +0 |
EnvironmentMapSpecular != 0 | +0 | +2 |
FogEnabled = true | +0 | +2 |
フレネル(Fresnel)とスペキュラについては別の機会に説明します。
DualTextureEffect
これは単純で、基本設定はひとつしかありません。
頂点シェーダー | ピクセルシェーダー | |
DualTextureEffect | 7 | 6 |
これに加えてフォグの有無によって以下の命令数が追加されます。
頂点シェーダー | ピクセルシェーダー | |
FogEnabled = true | +4 | +2 |
シンプルなエフェクトですが、実は見た目も良く、速度も速いエフェクトでもあります。ライトマップやディテールマップ(別の機会に紹介します)に適しています。
AlphaTestEffect
AlphaFunctionの設定によって以下の二つの組み合わせになります。
頂点シェーダー | ピクセルシェーダー | |
<, <=, >=, > | 6 | 6 |
==, != | 6 | 10 |
これにフォグの有無によって以下の命令数が追加されます。
頂点シェーダー | ピクセルシェーダー | |
FogEnabled = true | +4 | +2 |
原文: