2012-09-01 21 views
14

Recentemente ho pensato che sarebbe una buona idea passare dalla vecchia (deprecata) funzionalità fornita da OpenGL, come le operazioni con le matrici e la pipeline di funzioni fisse.glm :: ortho() ha effettivamente torto?

Sto usando GLM come libreria Matrix per semplificare un po 'le cose. Il problema è che potrebbe aver causato più problemi di quanto non fosse ...

Le proiezioni prospettiche funzionavano bene con i miei shader e setup, ma quando ho provato a passare a ortogonale, tutto si è rotto. I miei punti e quads semplici non verrebbero visualizzati. Quando ho usato le vecchie matrici OpenGL, le cose hanno iniziato a funzionare di nuovo.

Ho ridotto tutto alla matrice di proiezione. Ecco come l'ho chiamato:

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

ho confrontato che a quella fornita da OpenGL una volta che questo si chiama"

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

Le uniche differenze sono il [0] [0] elemento e [1 ] [1] elemento (che, per quanto ne so, è uguale a "2/larghezza" e "2/altezza", rispettivamente). Dalla matrice OpenGL, i valori erano esattamente così! Sulla matrice glm, però, i valori erano 0.

Dopo aver passato manualmente i valori dalla matrice glm dopo aver chiamato glm :: ortho, tutto funzionava di nuovo!

Quindi la mia domanda: la funzione glm :: ortho() è veramente rotta o sto semplicemente usando male?

risposta

39

Non sembra che dovrebbe essere rotto dal codice sorgente (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; 
} 

Il mio unico pensiero è che questo modello potrebbe essere la creazione di una matrice di numeri interi (come hai passato tutti gli interi alla funzione), e quindi facendo la divisione in interi, invece che in virgola mobile. Puoi provare ad aggiungere .f a tutti i tuoi parametri?

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

+7

Wow, sei stato perfetto! Dopo aver cambiato i miei parametri in float, tutto ha funzionato. Grazie per aver chiarito questo :) –