正投影の解像度に依存しない2Dゲームでサブピクセル値を回避する方法


8

2Dゲームで動くスプライトの解像度に依存しないレンダリングをしようとしています。私の計画は私の世界の固定座標系(たとえば960x540)で作業し、正投影を使用してビューポートに合わせて拡大または縮小します。レターボックス化して、さまざまなアスペクト比を処理します。

ほとんどのチュートリアルによると、私はビューフラスタムに好きな次元を自由に使用できますが、多くの場合、ビューポートでサブピクセル値を使用することになるという問題につながることがわかりました。たとえば、960 x 540の座標系の(62,62)にある頂点は、寸法800 x 450のビューポートの(51.6666667,51.6666667)に終わります。

私はそれに2種類の問題に気づきました:

  • テクスチャサンプリングは、動いているオブジェクトの場合、頂点がピクセルの中心に関連する場所に応じて常に変化します
  • 丸めが原因で、オブジェクトが水平または垂直に1ピクセルずつ伸びる

これを回避するためのベストプラクティスは何ですか(移動速度などに関して解像度の独立性を維持しながら)?そして、これに対処するのに最適な場所はどこですか?頂点をシェーダーに渡す前、または頂点シェーダー内に?


新しいビューポートに収まるようにサイズ変更と翻訳をどのように行っていますか?マトリックス?オブジェクトの位置を手動でスケーリングおよび移動しますか?
エミールリマ2014

@EmirLima頂点シェーダー内の結合されたモデル-ビュー-投影-マトリックスで座標を乗算しています。すべてのスケーリングは、正射投影行列によって行われます。
エリック


@ tm1rbrtコメントありがとうございます。幅または高さの1ピクセルを多かれ少なかれ回避するために、常に床または天井のいずれかを使用する必要があると思います。頂点シェーダーの内部でそれを試みましたが、そこでの計算の不正確さがそれを不可能ではないとしても困難にします。以前の整数に対して完全な整数であるはずだったものをフローリングしてしまいました。
Eric

回答:


1

シェーダーの前または最中に頂点に影響を与えるかどうかという主な質問に到達するには、シェーダーを使用することをお勧めします。ビューポートと座標系を考慮できるルーチンの記述方法を知っている場合は、多くのスプライトを並行して調整できるため、シェーダーを使用することをお勧めします。また、「コスメティック」座標がCPUコードのゲーム内座標から離れていることを保証するため、一方が他方に影響を与えません。

これは、頂点またはピクセルシェーダーで実行できます。ピクセルシェーダーでは、テクセルをシフトしてディスプレイ上のピクセルにロックすることができます。

DirectX9では、テクセルの角がピクセルに対して0.5、0.5にあるという奇妙な点を回避するためにHLSLでこれを行う必要があり、鮮明なテクスチャーが半ぼやけて見えます。これを修正すると、頂点を移動せずにテクセルの物理的な位置が変更されます。

あなたの場合、オフセットはフレームごとに異なるため、スプライトの真の座標をシェーダーに渡して、10進オフセットを計算します。テクスチャのラップを避けるために、テクスチャサンプリングをクランプすることを忘れないでください。


3

2セットの座標を保存すると思います。

  1. オブジェクトの描画に使用されるものDISPLAY POSITION
  2. を維持するために使用される秒TRUE POSITION

このようにして、座標が丸いスプライトを描画して、ビュー領域の固定サイズによって引き起こされる歪みを取り除くことができます。

ただし、これにより、ゲームロジックに影響を与えずに正確な位置を維持することもできます。サブピクセルの性質上、ビューとゲームロジックの間の不一致にも気付かないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.