2012-09-01 11 views
14

Kürzlich dachte ich, es wäre eine gute Idee, von der alten (veralteten) Funktionalität, die OpenGL bietet, zu wechseln, wie zum Beispiel Matrixoperationen und die feste Funktionspipeline.Ist Glm :: ortho() eigentlich falsch?

Ich verwende GLM als meine Matrix-Bibliothek, um die Dinge ein wenig zu vereinfachen. Das Problem ist, dass es mehr Probleme verursacht haben könnte als es vereinfacht hat ...

Perspektiven Projektionen funktionierten gut mit meinen Shadern und Setup, aber als ich versuchte, auf orthogonal zu schalten, brach alles zusammen. Meine Punkte und einfachen Quads wurden nicht angezeigt. Als ich die alten OpenGL-Matrizen benutzte, fingen die Dinge wieder an zu arbeiten.

Ich verengte alles auf die Projektionsmatrix. Hier ist, wie ich es genannt:

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

ich, dass von opengl versorgt einen Vergleich einmal das nennt man“

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

Die einzigen Unterschiede sind die [0] [0] Element und [1 ] [1] Element (das, soweit ich weiß, gleich "2/width" bzw. "2/height" ist). Aus der OpenGL-Matrix waren die Werte genau das! Auf der glm-Matrix jedoch die Werte waren 0.

Sobald ich die Werte von der Glm-Matrix manuell wechselte, nachdem ich Glm :: Ortho angerufen hatte, funktionierte alles wieder!

Also meine Frage: ist die Funktion glm :: ortho() wirklich kaputt, oder verwende ich sie einfach falsch?

Antwort

39

Es scheint nicht, dass es aus dem Quellcode (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; 
} 

Mein einziger Gedanke ist, dass diese Vorlage könnte eine Matrix von ganzen Zahlen zu schaffen (wie Sie haben gebrochen werden soll alle Intets an die Funktion übergeben) und somit eine Integer-Division anstelle eines Gleitkomma-Punktes durchführen. Können Sie versuchen, alle Ihre Parameter an .f anzufügen?

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

+7

Wow, Sie waren genau richtig! Nachdem ich meine Parameter in Floats geändert habe, hat alles funktioniert. Danke für das Aufräumen :) –