1

Xbox360 と WinXP のマルチプラットフォーム コードベースを維持しています。XP 側で、Xbox360 バージョンの D3DRS_VIEWPORTENABLE に関連しているように見える問題が見られますが、WinXP D3D9 には同等のものはありません。この記事には興味深いアイデアがありましたが、恒等行列を構築する唯一の方法は、D3DVIEWPORT9::X と D3DVIEWPORT9::Height に負の数を指定することですが、これらは符号なしの数値です。(とにかく負の数を入力しようとしましたが、何も興味深いことはありませんでした。)

では、WinXP/D3D9 で D3DRS_VIEWPORTENABLE の動作をエミュレートするにはどうすればよいでしょうか?

(明確にするために、私が見ている結果は、Xbox360 では 2D 画面に合わせたクワッドが正常に動作するが、WinXP ではオフセット/ストレッチされているということです。実際、(0, 0) は、WinXP ではなく、画面の中央から始まります。ビューポート変換を適用した結果、Xbox360 のように左下隅に表示されます)。

更新: この質問を書いた時点では Xbox360 devkit を持っていませんでしたが、その後入手しました。D3DRS_VIEWPORTENABLE 状態の無効化をコメントアウトしたところ、WinXP ビルドとまったく同じ動作が Xbox360 でも発生しました。したがって、WinXP でオフになっている D3DRS_VIEWPORTENABLE をエミュレートするために、このギャップを埋める DirectX マジックが必要です。

4

1 に答える 1

2

ネガをビューポート マトリックスに入れる方法を考える代わりに、射影マトリックスから考えてみてください。

ビューポート マトリックスは、投影マトリックスの直後に適用されます。したがって、ビューポートを ID に設定し、それを wvp (world-view-projection) マトリックスで乗算するとします。すなわち

world * view * projection * viewport

ビューポートを好きなように設定できるようになりました。

もちろん、これは実際に問題を攻撃する最善の方法でもありません。一部のドライバーは、ビューポートのエントリに基づいて最適化を行う可能性があります (たとえば、実際には行列の乗算を行わない場合があります)。私は上記のシステムを個人的に使用するつもりはありません。

それで、それはあなたをどこに置きますか?

まあ、実際にはまだかなり単純です。射影行列にビューポート行列の逆行列を掛けると、ビューポートの「行列」が適用されると互いに打ち消し合い、射影の直接出力が残ることがわかります。ビューポートは、事実上「無効」になりました。

于 2011-01-13T18:09:07.513 に答える