2012-09-01 12 views
14

最近、私は、OpenGLが提供するマトリックス操作や固定機能パイプラインなどの古い(非難された)機能から切り替えることをお勧めします。glm :: ortho()は実際には間違っていますか?

私は物事を少し簡単にするために、私の行列ライブラリとしてGLMを使用しています。問題は、それが単純化されたよりも多くの問題を引き起こしている可能性があることである...

透視投影は私のシェーダとセットアップでうまくいきましたが、私は直交に切り替えしようとしたとき、すべてが決裂しました。私のポイントと単純なクワッドは表示されませんでした。私が古いOpenGLマトリックスを使用した時、事態は再び働き始めました。

Iは投影行列に全てを絞り込みます。ここで私はそれを呼ばれる方法です:

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

私は、この後のOpenGLによって提供されるものに違いのみが[0] [0]要素と[1ある」

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

と呼ばれていることを比較] [1]要素(それぞれ「2 /幅」と「2 /高さ」に等しいと私が知る限り)OpenGL行列から、値はまさにその値でした!glm行列では、私はGLM ::オルトと呼ばれた後、私は手動ですべてが再び働いていた、GLM行列から値を切り替えた後の値が0

た!

だから私の質問は:本当に壊れGLM ::オルト()関数がある、または私はちょうどそれが間違って使用していますか?

答えて

39

それは、ソースコード(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);

+7

うわー、あなたにスポットがあった!私のパラメータを浮動小数点に変更した後、すべてがうまくいった。これをクリアしていただきありがとうございます:) –

関連する問題