- 1 名前:デフォルトの名無しさん [2007/09/23(日) 23:43:41 ]
- Microsoft XNA はマイクロソフトによって提供された、ゲーム開発のためのツールである。
XNA はマネージ実行環境を完備する。 2004 年 3 月 24 日、カリフォルニア州のサンノゼの Game Developers Conference で発表され、 2006 年 12 月 11 日にリリースされた。 XNA は「 XNA's Not Acronymed」 ( XNA は頭字語ではない)の頭字語である。 XNA デベロッパーセンター www.microsoft.com/japan/msdn/xna/ xna スタジオ xna-studio.jp/ XNA Game Studioメモ www.saturn.dti.ne.jp/~npaka/xna/ ということで立ててみた。
- 721 名前:>>719 mailto:sage [2010/03/04(木) 22:42:30 ]
- なるほど。とりあえず、
エフェクトの変更時は spriteBatch.Begin() - End() で囲んであげた方がよさそうですね ちょっと実験してみて、Effect の動作が少々分かったので書いておきます。(役に立てれば、と) spriteBatch.Begin() - End() で囲った中で、 エフェクトの変更を行い描画を行うと、 1 回前に描画したテクスチャの描画方法も 変更後のエフェクトで描画されるようです。 ただし、連続して同じテクスチャを描画する場合は、 それらをひとまとまりのグループとしてみる必要があります。 ( ただし、 SpriteSortMode.Immediate の時のみ。 ) ( 他は全て BasicEffect によって描画されてる気がした。) サンプルコードは書くととても長くなるので、 簡単な記述で例(実験結果)を示します。 その前に書いておきますが、CommitChanges() は 使ってもまったく効果がありませんでした。 また、以下の例では全て technique の変更についてのみ 書いてありますが、 pass の変更も同様の動作をします。 ( pass の実験はちょっとしかやってないから、 ) ( 自身はあまりありませんが... ) また、 spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.None); と spriteBatch.End() で囲っていると、脳内補完してください
- 722 名前:>>719 続き mailto:sage [2010/03/04(木) 22:43:31 ]
- 以下、例(実験結果)
----------------------------------------------- @ technique1 で texture1 を描画しようとする A technique2 で texture2 を描画しようとする B technique3 で texture3 を描画しようとする C technique4 で texture4 を描画しようとする ----------------------------------------------- @は 1 つ後ろのAの影響を受け、 Aの描画方法である technique2 で描画されます。 Aも同様にBの technique3 で描画され、 Bも同様にCの technique4 で描画され、 Cは 1 つ後ろに何も描画命令が無いため、 普通に、自身の technique4 で描画されます。 ----------------------------------------------- @ technique1 で texture1 を描画しようとする A technique2 で texture1 を描画しようとする B technique3 で texture1 を描画しようとする C technique4 で texture1 を描画しようとする ----------------------------------------------- @ABCは全て texture1 を描画しようとしている為、 これらを 1 つのグループとして扱います。 この場合は、1 番最後の描画方法である technique4 で このグループは描画されます。
- 723 名前:>>719 続きの続き mailto:sage [2010/03/04(木) 22:44:48 ]
- -----------------------------------------------
@ technique1 で texture1 を描画しようとする A technique2 で texture1 を描画しようとする B technique3 で texture1 を描画しようとする C technique4 で texture1 を描画しようとする D technique5 で texture2 を描画しようとする ----------------------------------------------- @ABCは全て texture1 を連続で描画しようとしている為、 これらを 1 つのグループとして扱います。 しかし、このグループは、次の描画命令Dの影響を受け、 technique5 で描画されます。 D は普通に technique5 で描画されます
- 724 名前:>>719 続きの続きの続き mailto:sage [2010/03/04(木) 22:45:30 ]
- -----------------------------------------------
@ technique1 で texture1 を描画しようとする A technique2 で texture1 を描画しようとする B technique3 で texture2 を描画しようとする C technique4 で texture1 を描画しようとする D technique5 で texture1 を描画しようとする E technique6 で texture3 を描画しようとする ----------------------------------------------- @Aは連続で texture1 を描画しようとする為、 形式上、これをグループA として扱います。 グループA は 1 つ後ろの描画方法である technique3 で 描画されます。 Bは 1 つ後ろの描画方法である technique4 で描画されます。 CDは連続で texture1 を描画しようとする為、 形式上、これをグループB として扱います。 グループB は 1 つ後ろの描画方法である technique6 で 描画されます。 Eは普通に technique6 で描画されるようです。 ( グループA とグループBは、間にtexture2(B)の描画命令が ) ( 入っているので、別物として扱います。 ) 以上が実験結果です。動作原因なんかは当然分かりません。
- 725 名前:>>719 mailto:sage [2010/03/04(木) 22:46:24 ]
- 解決策を考えてみました
@全ての描画命令を spriteBatch.Begin()-End()で囲ってやる A連続しないテクスチャ描画の場合は 1 つだけ描画方法 をずらして描画する (最後の描画方法は、画面外にテクスチャを描画することで解決) B1 つテクスチャを描画するごとに、同じ描画方法でもう一度 画面外に別のテクスチャを描画する。
- 726 名前:>>719 [2010/03/04(木) 22:58:19 ]
- @は 1 番簡単な方法です。が、グラボを効果的に使用できない可能性が
あります。 ( グラボは描画自体は速いが、描画の準備にかかる時間がとても長い ) ( らしいので ) Aは全ての状況には対応出来ない上、苦労に伴わない。 (if文などで描画命令を制御する時なんかはとてもしんどいと思う。) Bの方法は、画面外へ描画したテクスチャが、1 つ後ろの描画方法の 影響を受けても、見えないので問題はない。しかし、画面外に描画す るテクスチャは、そのゲーム中では使わないものを使う必要があります。 ( 連続で同じテクスチャの描画を行う時は、3 番目の例から分かるように ) ( グループ化されてしまう為、グループごと描画方法が変わってしまう ) ただし、描画枚数が 2 倍になるため、速度がどうなるかはわかりません。 他に方法があれば、教えてください。 と、いうよりここまで書いておいて、もし根本的に違うなら 教えてください orz
|

|