10

私は周りを見回しましたが、各マトリックスが何をするのか、どのような操作がそれらを形成するのかを正確に見たことがありません(つまり、実際の固有関数が呼び出します)。これは私が探しているものです。または、少なくともプロセスの説明と固有関数を使用したいくつかの例で、一般的な方法を確認してください。とにかく、役に立つ場合に備えて、いくつかの詳細を以下に示します。

トップダウンのパースペクティブ ゲームをセットアップしています (そのため、カメラは下向きに固定されていますが、回転して XY 平面に沿って移動できます)。透視投影がうまく機能します。しかし、正投影を形成するにはどのようなコマンドが必要なのだろうか...

カメラの座標を原点に変換し、カメラの回転によって回転させ、それらを元の場所に変換し、ズーム用にスケーリングすることによって行われるビューを理解していますか? しかし、正確にはどの関数とオブジェクトが関与するのかはわかりません。

また、特定のオブジェクトの回転を保存するには、クォータニオンが最適な選択のようです。それで、それはモデルの投影を決定しますか? 回転を 1 つの角度の 2D ケースに単純化できた場合、クォータニオンは無駄になりますか?

そして、これらの行列はすべてフレームごとにアイデンティティから再生成する必要がありますか? または、新しいデータに合わせて何らかの方法で変更できますか?

私は手持ちのライブラリの代わりにこれに固有値を使用することを本当に好みますが、何が起こっているのかを正確に把握するために何かを使用する必要があります...すべてのGLSLセットアップと均一なマトリックスがレンダリングに供給されています私のVAOでは、理解して作成するだけです。

編集:
私の頂点シェーダーは、位置 vec3 で乗算される 3 つの均一な mat4 でこの標準セットアップを使用します。

gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0);

mat3s と vec2 を位置に使用して、純粋に 2D の場合にパフォーマンスを向上させることはできますか?

4

2 に答える 2

14

これは、単純な入力からビューと射影行列を作成する lookAt 関数と setPerspective 関数の例です。

void Camera::lookAt(const Eigen::Vector3f& position, const Eigen::Vector3f& target, const Eigen::Vector3f& up)
{
  Matrix3f R;
  R.col(2) = (position-target).normalized();
  R.col(0) = up.cross(R.col(2)).normalized();
  R.col(1) = R.col(2).cross(R.col(0));
  mViewMatrix.topLeftCorner<3,3>() = R.transpose();
  mViewMatrix.topRightCorner<3,1>() = -R.transpose() * position;
  mViewMatrix(3,3) = 1.0f;
}

void Camera::setPerspective(float fovY, float aspect, float near, float far)
{
  float theta = fovY*0.5;
  float range = far - near;
  float invtan = 1./tan(theta);

  mProjectionMatrix(0,0) = invtan / aspect;
  mProjectionMatrix(1,1) = invtan;
  mProjectionMatrix(2,2) = -(near + far) / range;
  mProjectionMatrix(3,2) = -1;
  mProjectionMatrix(2,3) = -2 * near * far / range;
  mProjectionMatrix(3,3) = 0;
}

その後、行列を GL に指定できます。

glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_view"), 1, GL_FALSE, mCamera.viewMatrix().data());
glUniformMatrix4fv(glGetUniformLocation(mProgram.id(),"mat_proj"), 1, GL_FALSE, mCamera.projectionMatrix().data());

モデル変換 (ビューとモデルを分離しておくことをお勧めします) では、Geometry モジュールを Scaling、Translation、および Quaternion クラスと共に使用して、Affine3f オブジェクトを組み立てることができます。

于 2012-12-09T09:26:49.260 に答える
0

シェーダーは、レンダリング パイプラインに提供されるすべての頂点に対して実行されます。最高のパフォーマンスを得るには、通常、CPU で「ユニフォーム」操作を実行し、ユニフォームを使用してすべてのシェーダー インスタンスに詳細な情報を渡し、実行します...

あなたが提供した例では、実際mat4 * vec4には の代わりにのみを計算する方が良いです:mat4 * mat4 * mat4 * vec4

gl_Position = modelviewprojectionMatrix * vec4(in_Position, 1.0);

modelviewprojectionMatrixの結果はどこにありますかprojectionMatrix * viewMatrix * modelMatrix。行列演算は、レンダリングする必要がある頂点のセットごとに、CPU 側で実装されます。

要件に応じて、モデル ビュー プロジェクション マトリックスを導出するために必要なデータをどのように整理しますか。実際のパフォーマンスは、レンダリングされるシーン グラフによって異なります。たとえば、平行移動のみ (おそらく XY 平面上のみ) を行う場合、ベクトルのみの平行移動が可能であり、必要なときに行列を生成します。

行列は、標準の代数演算で乗算されます。行列は、モデル行列または射影行列にすることができます。変換は、2 つの変換行列を乗算することによって連結できます。

于 2012-12-07T19:51:55.050 に答える