2011-08-16 10 views
0

私はXNA、特にSpriteBatchに非常に微妙な問題があります。 私のゲームでは、私はカメラクラスを持っています。それはビューを(明らかに)翻訳することができますまたズームインとズームイン。 spritebatchインスタンスの "Begin"関数(最後のパラメータ)を呼び出すと、シーンにカメラが適用されます。SpriteBatchのドローコールはXNAによって削除されますか?

問題:Zoomfactorのカメラが1.0fを超えると、スプライトバッチが描画を停止します。 私は自分のシーンをデバッグしようとしましたが、間違ったところを見つけることができませんでした。

"Matrix.CreateScale(2.0f);でレンダリングしようとしました。 「開始」の最後のパラメータとして使用します。 他のすべてのパラメータはnullで、最初の「SpriteSortMode.Immediate」です。カスタムシェーダなどはありません。 しかし、SpriteBatchは引き続き描画したくありませんでした。

次に、 "DrawString"とDrawStringだけを呼び出して、提供されたスケール(2.0f)で完璧に動作させようとしました。

しかし、多くの試行錯誤を経て、ScaleMatrixにMatrix.CreateTranslation(0、0、-1)を掛けても何らかの形で "安全"値が1.1fに変更されていることがわかりました。 したがって、1.1fまでのすべてのスケール値が機能しました。上記のすべての場合、SpriteBatchは通常の描画呼び出しでは1つのピクセルを描画しません。 (DrawStringはまだ影響を受けず、動作しています)。

どうしてですか? ビューポートや他のマトリックスを設定しませんでした。 これは、奇妙なニア/ファークリッピングのようなものかもしれません。 しかし、私は通常、3Dのものからそれらのパラメータだけを知っています。

不明な点がある場合はお問い合わせください。

答えて

2

近い/遠いクリッピングです。

あなたが描画したものはすべて、投影空間に変換されてラスタライズされます。そのスペースは、画面の左下の(-1、-1)から右上の(1,1)まで実行されます。しかし、それはちょうど(X、Y)の座標です。 Z座標では、0から1(前から後)になります。このボリューム外のものはすべて切り取られます。 (参考文献:123。)

あなたが3Dで作業しているときは、使用射影行列が近い面が投影空間に0で土地、そして遠く飛行機が着陸するようにZがダウン座標に圧縮されます

2Dで作業するときは、通常はほぼ同じことを行う近平面パラメータと遠平面パラメータを持つMatrix.CreateOrthographicを使用します。 SpriteBatchは独自の行列を指定し、nearとfarの平面を0と1のままにします。SpriteBatchのスプライトの頂点は、通常は使用されていませんが、実際にはZ座標を持ちます。これは、layerDepthパラメーターで指定します。したがって、レイヤーの深さを0.5より大きく設定してから2までスケールアップすると、Z座標は0から1の有効範囲外になり、レンダリングされません。

(。ドキュメントが1から0が有効な範囲ですが、変換行列を適用するときに何が起こるかを指定していないと言っている)

解決策は非常に単純です:あなたのZ座標を拡大縮小しません。

Matrix.CreateScale(2f, 2f, 1f) 
+0

ソリューションは完璧に機能します。詳細な説明をくれてありがとう、本当に便利でした! – riki

関連する問題