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