"ComputerGraphics/HLSL/XNA/UsePixelShaderModel3InSpriteBatch";VisualStudio2010XNA4.0XNA4.0で新規ファイルとしてEffectファイルを追加すると、デフォルトのシェーダモデルは2_0となっている。2012年7月現在シェーダモデルは5まで進んでいるので、モデル2はいささか古い。いえXNA4.0はDirectX9の上に作られたフレームワークなので利用できるシェーダモデルは(たしか)3まで。シェーダモデル2と3では雲泥の差がある。シェーダモデル3はモデル2と異なり、利用できる演算数の上限がなくなっている。対してモデル2では演算数の上限が64と定められているため、実装したい内容によってはモデル3が必須となってくる。ここでレンダーステートを設定します。}}SpriteBatchによるレンダリングへの適用VetexShader、PixelShaderともシェーダモデル3_0を使うのであればどうということはなく、デフォルトで定められているシェーダモデルの記述を「2_0」から「3_0」と書き換えればよい。ここでレンダーステートを設定します。}}ところがSpriteBatchでレンダリングする場合は、単純にはいかない。VertexShaderがなくともコンパイルが通るし、実際にプログラマにはPixelShaderしか利用していない様に見える。そこでとりあえず次の様なことを試すことになる。}すると一応コンパイルは通る。いざプログラムを実行しようとするとエラーが起きる。「InvalidOperationException」である。モデルと混在させることはできません。コンパイルする必要があります。先にも述べたように、XNAでは標準的にシェーダモデル2が利用されている。プログラマ側に開示はされていないが、SpriteBatchを利用して描画する際に、内部的にはシェーダモデル2のVertexShaderが利用されている、ということらしい。この問題を解決するには、XNAのSpriteBatchで用いられるVertexShaderと同等の関数を用意し、シェーダモデル3として自前でコンパイルするしかない。To調べてみると多くの所で同様の問題について言及されているので直に答えに行きつく。要するにVertexShaderでは頂点の投影が行われるわけなので、SpriteBatchによる描画と同等の結果を得るためには、描画域と同サイズの平行投影を行えばよいことになる。ソースコードについては解説しないが、次の様になっている。サンプルプロジェクトを展開するなりして確認されたい。これはテクスチャーの描画に使用できます。}Result図の通り実行結果は通常のSpriteBatchによる描画と同等になっている。多少記述量が増えるが一度実装してしまえば以降はPixelShaderのみ気にして実装すればよいので、然程気にならない。いえ早いところ標準のシェーダモデルを3にして貰いたいものである。XBOX等のハードウェア側の対応待ちか。最新のシェーダモデルまで引き上げてくれることを期待する。著作権Administrator。