Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Du schriebst doch schon, dass die Rotationsmatrizen eigentlich funktionieren. Wenn ich dich richtig verstanden habe, hast du also auf der CPU die Matrizen berechnet und mittels glUniformMatrix4fv zur Grafikkarte hochgeladen.
Wenn du jetzt nicht um den Koordinatenursprung drehen möchtest, benötigst du zusätzlich Translationen. Also wenn du um den Punkt P rotieren möchtest, translierst du erst um -P, rotierst dann und anschließend machst du wieder eine Translation um P. Das alles kannst du in eine 4x4-Matrix stecken, indem du die Translationsmatrix mit der Rotationsmatrix multiplizierst und die resultierende Matrix mit der anderen Translationsmatrix multiplizierst. Das was du jetzt raus hast, übergibst du an den Shader.
Das ist auch genau das, was die OpenGL1-Funktionen gemacht haben. Dort lag ganz oben auf dem Matrixstack die aktuelle Modelview-Matrix, die du mit glLoadIdentity() auf die Einheitsmatrix gesetzt hast. Dann hättest du glTranslate aufgerufen, was eine Translationsmatrix erstellt und die Modelview-Matrix damit multipliziert (nicht ersetzt). Analog bei glRotate: Erst wurde eine Rotationsmatrix berechnet und dann wurde die aktuelle Matrix mit dieser Rotationsmatrix multipliziert.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Nein. Die Matrizen, egal ob für Rotation, Translation oder Skalierung (oder eine Kombination aus allen) berechnet die CPU. Die fertig berechnete Matrix wird dann an die GPU übergeben, und zwar mit glUniformMatrix4fv. Die Grafikkarte (genauer: der Vertexshader) multipliziert dann die Vertices mit der Matrix.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ja, das geht. Ist das etwa der Versuch, eine eigene Implementierung der Matrixmultiplikation zu umgehen? (Du wirst früher oder später sowieso nicht umhin kommen.)
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Also die in GLSL eingebauten Matrixfunktionen funktionieren praktisch per Definition. Es ist daher eine gute Idee, zu prüfen, ob die eigene Implementation das Gleiche tut. Wenn es trotzdem nicht klappt, wie es soll, muss es an was anderem liegen. Entweder du berechnest die Matrizen m1 und m2 falsch oder das, was du mit m3 machst, ist nicht das, was du eigentlich willst. Eine häufige Fehlerquelle ist auch das Durcheinanderbringen von spalten- und zeilenweiser Speicherung (man kann beides machen, aber man muss es einheitlich tun) der Matrizen bzw. der Multiplikationsreihenfolge. Wenn du statt
Code:
m3 = m1 * m2;
schreibst
Code:
m3 = m2 * m1;
hat dies den selben Effekt, als wenn du eine der beiden Matrizen transponieren würdest.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Nicht funktioniert heißt soviel, wie das du etwas falsch gemacht hast. Um dir zu sagen, was du falsch gemacht hast, musst du uns schon sagen, was das Fehlerbild war/ist und wie dein Shader als auch der OpenGL Code aussieht. Alles selber zu basteln hat zwar sicher einen gewissen Lerneffekt, ist aber uneffizienter und wenn es schon mit den fertigen Funktionen nicht funktioniert auch nicht zielführend.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
@damadmax: Aus dem Kontext gerissen wirkt der Schnippsel natürlich etwas merkwürdig. Ich hatte mathias vorher gesagt, dass man alle Transformationen in eine Matrix stecken kann, indem man die Matrizen miteinander multipliziert. Den von dir zitierten Beitrag würde ich daher interpretieren wie: "Kann man das auch in GLSL machen und zwar auf diese Weise?" Da stehen ja schließlich 3 Punkte am Anfang und am Ende...
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
mathias hat geschrieben:
Habe ich das richtig verstanden, man kann nicht auf Funktionen im Shader zugreifen.
Du kannst OpenGL nicht sagen: "Führe mal diese GLSL-Funktion mit diesen Parametern aus und sag mir was rauskommt." Falls du das mit zugreifen meintest.
Was aber geht: Du kannst im Shader beliebig viele Funktionen definieren, welche dann von der main()-Funktion oder anderen Funktionen (im selben Shader) aufgerufen werden. So könntest du z.B. deine eigene Matrixmultiplikation auf Korrektheit prüfen. Wenn du z.B. eine TranslationMatrix und eine RotationMatrix hast, kannst du
beide per glUniform an den Shader übergeben. Den Shader lässt du beide (mit der von dir geposteten Funktion Multi) multiplizieren und die Vertices mit der resultierenden Matrix transformieren.
beide auf der CPU multiplizieren und nur das Resultat an den Shader übergeben. Dies ist die performantere Methode, weil die Matrixmultiplikation nur einmal durchgeführt werden muss, und nicht für jeden Vertex einzeln.
Wenn die Ergebnisse sich unterscheiden, hast du einen Fehler in deiner Implementation.
mathias hat geschrieben:
Irgendwo habe ich gelesen das beim Matrix rechnen folgendes ist a * b <> b * a.
Stimmt, die Matrixmultiplikation ist nicht kommutativ.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.