25

私は最近、行列演算や固定関数パイプラインなど、OpenGL が提供する古い (非推奨の) 機能から切り替えることをお勧めします。

物事を少し単純化するために、マトリックス ライブラリとして GLM を使用しています。問題は、単純化するよりも多くの問題を引き起こした可能性があることです...

パースペクティブ プロジェクションはシェーダーとセットアップでうまく機能しましたが、直交に切り替えようとすると、すべてが機能しなくなりました。ポイントと単純なクワッドが表示されません。古い OpenGL マトリックスを使用すると、再び機能し始めました。

すべて射影行列に絞り込みました。これが私がそれを呼んだ方法です:

glm::mat4 projMat = glm::ortho( 0, 400, 0, 400, -1, 1 );

これが呼び出されたら、それをopenglによって提供されるものと比較しました」

glOrtho( 0, 400, 0, 400, -1, 1 );

唯一の違いは [0][0] 要素と [1][1] 要素です (私の知る限り、それぞれ「2/幅」と「2/高さ」に等しい)。OpenGL マトリックスから、値はまさにそれでした! ただし、glm マトリックスでは、値は 0 でした。

glm::ortho を呼び出した後、手動で glm マトリックスから値を切り替えると、すべてが再び機能していました。

だから私の質問: glm::ortho() 関数は本当に壊れていますか、それとも間違って使用していますか?

4

1 に答える 1

68

ソース コード (v 0.9.3.4) からは壊れているようには見えません。

template <typename valType> 
GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho
(
    valType const & left, 
    valType const & right, 
    valType const & bottom, 
    valType const & top, 
    valType const & zNear, 
    valType const & zFar
)
{
    detail::tmat4x4<valType> Result(1);
    Result[0][0] = valType(2) / (right - left);
    Result[1][1] = valType(2) / (top - bottom);
    Result[2][2] = - valType(2) / (zFar - zNear);
    Result[3][0] = - (right + left) / (right - left);
    Result[3][1] = - (top + bottom) / (top - bottom);
    Result[3][2] = - (zFar + zNear) / (zFar - zNear);
    return Result;
}

私の唯一の考えは、このテンプレートが整数の行列を作成している可能性があり (関数にすべての int を渡したため)、浮動小数点の代わりに整数除算を行っている可能性があるということです。.fすべてのパラメータに追加してみてください。

glm::mat4 projMat = glm::ortho( 0.f, 400.f, 0.f, 400.f, -1.f, 1.f );

于 2012-09-01T18:40:55.143 に答える