Quindi, mi sono imbattuto in alcune stranezze tra GLSL e GLM.incoerenze con le matrici matematiche tra GLSL e GLM, oppure esiste una matrice di visualizzazione "cattiva"
Se genero seguente vista matrice (C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
E poi, in GLSL, do:
fragColour.rgb = vec3(inverse(viewMat) * vec4(0,0,0,1))/4.f;
Poi mi aspetto per lo schermo diventi rosso-rosato, o (1.0,0.25,0.25). Invece, divento nero.
Se faccio questo in GLM, però:
vec3 colour = vec3(glm::inverse(viewMat) * vec4(0,0,0,1))/4.f;
cout << glm::to_string(colour) << endl;
ottengo il risultato di aspettarsi (1.0,0.25,0.25).
Ora, se cambio la viewMat di essere invece (C++):
vec3 pos(4, 1, 1);
vec3 dir(1, 0.000001, 0);
mat4 viewMat = glm::lookAt(pos, pos+dir, vec3(0,0,1));
poi bam! Ottengo (1,0,0.25,0.25) in entrambi GLSL e GLM.
Questo non ha senso per me. Perché fa questo? Questa view matrix funziona bene ovunque in GLSL - Non riesco proprio a invertirla. Questo succede ogni volta che dirY == 0.f.
Inoltre, si prega di suggerire miglioramenti per il titolo della domanda, non sono sicuro di cosa dovrebbe essere.
Modifica: Inoltre, non sembra avere nulla a che fare con lookAt's up vector (che ho impostato su Z comunque). Anche se ho impostato su (0,1,0), accade la stessa cosa. Tutto gira di lato, ma non riesco ancora a invertire la matrice delle viste in GLSL.
Modifica: Ok, quindi su suggerimento di derhass, ho provato a inviare la matrice di visualizzazione già invertita. Bam, funziona perfettamente. Quindi, sembra che la mia implementazione GL sia in qualche modo incapace di invertire quella matrice. Questo dovrebbe essere facilmente il bug GL più strano che abbia mai incontrato. Sarebbe comunque gradita una qualche spiegazione del perché sia una cattiva idea quella di invertire le matrici negli shader. EditAgain: l'invio di matrici invertite nel mio motore ha comportato un enorme aumento di framerate. DEFINITIVAMENTE FACCIAMO.
Bene, per quanto posso dire, questo problema è totalmente irrealizzato. Sembra che questo sia solo un problema con l'inversione in GLSL. Il modo in cui la matrice è impostata, dovrebbe essere perfettamente invertibile e i problemi numerici non dovrebbero essere un problema. Questo potrebbe essere solo un problema con la tua implementazione GL. Si noti inoltre che l'inversione delle matrici nello shader è una cattiva idea nella maggior parte dei casi, ma ovviamente dovrebbe funzionare. Raccomando di testarlo con alcune altre implementazioni GL, se possibile. – derhass
@derhass Ahhh, non avevo considerato l'invio della matrice già invertita. Ci proverò. Cercherò anche di vedere se il problema si verifica anche altrove. Sto usando un driver nvidia abbastanza vecchio (quello dei repository di Ubuntu 14.04) al momento. – Jagoly
Questa è stata la prima volta che ho appreso che GLSL ora ha una funzione inversa. Non è sicuramente un'operazione amichevole della GPU. Sii sempre consapevole della gerarchia delle operazioni: Per disegnare, per vertice, per frammento. Spostare sempre le cose il più in basso possibile. Hai appena colpito un percorso di codice molto improbabile facendo inverso per vertice. Si noti inoltre che un inverso generico di solito non è necessario. La maggior parte delle matrici di visualizzazione del modello dovrebbe essere "orto normale". Dove l'inversa è la stessa della trasposizione. – starmole