Effect APIの変更点
今までのXNA Game StudioでEffectクラスを使う場合、
effect.Begin();
effect.CurrentTechnique.Passes[0].Begin();
DrawStuff();
effect.CurrentTechnique.Passes[0].End();
effect.End();
のように書いていましたが、XNA 4.0では
effect.CurrentTechnique.Passes[0].Apply();
DrawStuff();
と、なります。
また、CommitChangesを使う以下のコードは
effect.Begin();
effect.CurrentTechnique.Passes[0].Begin();
DrawStuff();
// パラメーターを変更して描画するeffect.Parameters["lives"].SetValue(9);<br>effect.CommitChanges();
DrawOtherStuff();
effect.CurrentTechnique.Passes[0].End();
effect.End();
以下のように書くことができます。
effect.CurrentTechnique.Passes[0].Apply();
DrawStuff();
// パラメーターを変更して描画する
effect.Parameters["lives"].SetValue(9);
effect.CurrentTechnique.Passes[0].Apply();
DrawOtherStuff();
注釈:4.0 CTPでパフォーマンスのプロファイルをした人の中にはApplyメソッドがCommitChangesより遅いと気づいたかもしれませんが、心配しないでください。これはCTPリリースに最適化が間に合わなかっただけで一時的なものです。
また、4.0では幾つかの機能を削除しています。
- 低レベルシェーダーAPI(VertexShader, PixelShader, SetVertexShaderConstant, SetPixelShaderConstant, GetVertexShaderConstant, ShaderPorfile, ShaderRegisterSet, そしてShaderSemantic)。これらの機能はEffectやEffectParameterと同様の機能を持ちますが、DirectX 9との結びつきの強く、DirectX 10や11では効率的に実装できません。Effectは既に複数のネイティブ層を抽象化しており、多くの人達がEffectを好んで使用しています。
- EffectPoolの削除。この機能は混乱の元であり、期待する便利な機能を提供するものではありませんでした。
- EffectParameterBlockの削除。これは最適化に使える!と思って使ってみると使わないときよりパフォーマンスが低下してしまうという問題がありました。
- その他の使用頻度が極端に低いもの(EffectFunction, effect.Creator, EffectParameter.SetArrayRange, そしてEffectTechnique.IsparameterUsed)
最後に、新しいWindows HLSLコンパイラに更新しました。つまり、
- 新しいHLSL機能が使える、例えばループコントロール属性など
- シェーダーモデル1.xはサポートしなくなりました。XNA Game Studio 4.0を動作させるにはシェーダーモデル2.0以上に対応したGPUが必要です
原文:
http://blogs.msdn.com/shawnhar/archive/2010/04/22/effect-api-changes-in-xna-game-studio-4-0.aspx