2012-09-01 11 views
14

Niedawno myślałem, że dobrym pomysłem byłoby przełączyć się ze starej (przestarzałej) funkcjonalności udostępnianej przez OpenGL, takiej jak operacje macierzowe i potok funkcji.Czy glm :: ortho() jest rzeczywiście błędne?

Używam GLM jako mojej biblioteki macierzy w celu uproszczenia niektórych rzeczy. Problem polegał na tym, że mogło to spowodować więcej problemów, niż się uprościło ...

Perspektywiczne projekcje działały dobrze z moimi shaderów i konfiguracji, ale kiedy próbowałem przejść na ortogonalne, wszystko się zepsuło. Moje punkty i proste quady nie były wyświetlane. Kiedy używałem starych macierzy OpenGL, wszystko zaczęło działać.

Zawęziłem to wszystko do macierzy projekcji. Oto jak ja nazywa go:

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

Porównałem to z jednej dostarczonych przez OpenGL raz nazywa się to”

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

Jedyne różnice są [0] [0] Element i [1 ] [1] element (który, o ile mi wiadomo, jest równy odpowiednio "2/width" i "2/height") Z macierzy OpenGL, wartości były dokładnie takie same! Na macierzy glm, wartości były następujące:

Po ręcznym przełączeniu wartości z macierzy glm po wywołaniu glm :: orto, wszystko znowu działało!

Moje pytanie: czy funkcja glm :: ortho() naprawdę jest zepsuta, czy też używam jej niewłaściwie?

Odpowiedz

39

Nie wydaje się, że powinien on zostać uszkodzony z kodu źródłowego (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; 
} 

Jedyna myśl, że ten szablon może być tworzenie macierzy liczb całkowitych (jak masz przekazywał wszystkie ints do funkcji), a tym samym robi podział liczb całkowitych zamiast zmiennoprzecinkowych. Czy możesz spróbować dołączyć .f do wszystkich swoich parametrów?

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

+7

Wow, byłeś na miejscu! Po zmianie parametrów na pływające wszystko się udało. Dziękuję za wyjaśnienie :) –

Powiązane problemy