1

古いソフトウェアを OpenGL をサポートするように変換しています。DirectX と OpenGL では座標系が異なります (OpenGL が右、DirectX が左)。古い固定パイプライン機能では、次を使用することを知っています。

glScalef(1.0f, 1.0f, -1.0f);

今回は、GLM とシェーダーを使用しており、互換性のあるソリューションが必要です。カメラ行列にスケーリング ベクトルを乗算しようとしましたが、うまくいきませんでした。

これが私のカメラのセットアップです:

// Calculate the direction, right and up vectors
 direction = glm::vec3(cos(anglePitch) * sin(angleYaw), sin(anglePitch), cos(anglePitch) * cos(angleYaw));
 right = glm::vec3(sin(angleYaw - 3.14f/2.0f), 0, cos(angleYaw - 3.14f/2.0f));
 up = glm::cross(right, direction);

 // Update our camera matrix, projection matrix and combine them into my view matrix
 cameraMatrix = glm::lookAt(position, position+direction, up);
 projectionMatrix = glm::perspective(50.0f, 4.0f / 3.0f, 0.1f, 1000.f);
 viewMatrix = projectionMatrix * cameraMatrix;

ベクトルを逆にしたり、シェーダーで z 座標を逆にしたりするなど、さまざまなことを試しました。また、さまざまな行列とベクトルの逆数を掛けて、カメラ行列にスケーリング ベクトルを掛けてみました。

4

1 に答える 1

6

利き手はあまり考えないでください。確かに、それらは異なる規則を使用していますが、それらを使用しないことを選択するだけで、両方の API でほぼ同じものになります。私のアドバイスは、次の 2 つの点を除いて、両方の API でまったく同じマトリックスとセットアップを使用することです。

DX から GL に移植するために必要なことは、次のとおりです。

  1. カリング面のワインディングを逆にする - DX はデフォルトで反時計回りにカリングしますが、GL はそれを維持します。
  2. さまざまな深度範囲に合わせて調整します。DX は 0 (近い) から 1 (遠い) の深度範囲を使用しますが、GL は近い場合は -1、遠い場合は 1 の符号付き範囲を使用します。これは、射影行列の「最後のステップ」として実行できます。

DX9 にもピクセル座標のオフセットに関する問題がありますが、これはまったく別の問題であり、DX10 以降の問題ではなくなりました。

あなたが説明したことから、GLM関数を使用してOpenGLに適した行列を生成しているため、ワインディングはおそらくあなたの問題です。

于 2012-08-03T23:12:58.197 に答える