0

Direct3D 11 で GUI を描画しています。現在、画面の近くに 3D クワッドをたくさん描画して管理しています。画面クワッドをインスタンス化して速度を少し改善することにしました。

クワッドを描画するとき、次のようにクワッドを定義する座標のセットである入力位置 (input.pos) を指定します。

0,0
0,1
1,0
1,1

また、クワッドの画面空間内の位置であるインスタンス位置も渡します。

456,700

最後に、クワッドのスケール (ピクセル単位) を渡します。したがって、50x30 ピクセルのクワッドのスケール値は次のようになります。

50,40

これらの座標をピクセル シェーダーのクリップ空間に変換するために、次の計算を使用します (最終的には CPU で行うつもりですが、今のところは頂点シェーダーで行います)。

output.pos = float4((input.pos*2* input.instanceScale) / winSize+input.instancePos*2/winSize -1,0.25,1);

これはほとんど機能し、すべてが他のすべての近くに表示されますが、y 軸が反転しています。これは、クリップ スペースが -1 から 1 まで変化するためですが、1 がクリップ スペースの画面の一番上にあるためです。これは、通常の方法とは異なります。したがって、解決策は次のようになります。

output.pos.x = 2*(input.pos.x * input.instanceScale.x + input.instancePos.x)/winSize.x -1;
output.pos.y = 1 - 2*(input.pos.y * input.instanceScale.y + input.instancePos.y)/winSize.y;

ただし、これを実行すると、クワッドが消えます。それらはまだレンダリングされていると思いますが、画面外のどこかです。

何がうまくいかないのか誰にも分かりませんか?

また、新しい output.pos.x 計算を保持し、y 座標に古い計算を使用すると、引き続き機能します。したがって、問題はこの新しいコードの 2 行目にあるはずです。

どうもありがとう

EDIT1: TomMcTwattyPants のアドバイスに従い、最終的な y 位置を 1 から -1 の間で lerped しました。何が起こるかというと、GUI 要素が中央に向かって垂直に移動し、縮小します。中心に到達すると、収縮して存在しなくなり、ループします。

ループの前に遅延があるため、乗算の 0 と -1 の部分の間でクワッドが見えないと考えています。理由はわかりませんが、おそらく頂点の順序が変更されたため、法線が画面から離れて指し示され、カリングされているのでしょうか? 背面カリングをオフにして、何かが変わるかどうかを確認します。とにかく、GUI パスには必要ありません。

EDIT2: 問題は裏面カリングでした。それを無効にすることですべてが修正されました

4

2 に答える 2

2

y 軸を反転する最も簡単な方法は、マイナス 1 を掛けることです。

output.pos.y *= -1;
于 2012-04-12T15:08:22.247 に答える
1

同じ問題が発生しました。クワッドが消えている場合は、おそらくインデックスの巻き上げ順序が原因です。背面カリングを無効にする代わりに、クワッドの巻き順を逆にすると、すべてが機能しました。

于 2013-07-11T20:37:11.227 に答える