Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ich habe in meine Tech-Demo grade planare Reflektionen eingebunden, also im Gegensatz zur glSlang-Demo nutze ich keine Cubemap sondern rendere die Spiegelung in eine einzelne Textur, und lege die so auf die Spiegelfläche :
Wie man sieht nutze ich die Texturenmatrix um die Koordianten der spiegelnden Fläche so anzupassen dass meine Spiegelung korrekt ist. Das funktioniert auch ohne Probleme.
Dann wollte ich via 3D-Noise (wie in meiner glsl-Water-Demo) die Spiegelfläche um einen Wassereffekt erweitern. Allerdings klappt irgendwie schon das normale Rendern der Spiegelfläche nicht wie ich will. Der Quellcode ist der selbe wie oben, aber zusätzlich werden folgende Shader genutzt :
Man müßte eigentlich projektives Texturing verwenden. Da gibt es die Texture Funktionen mit "proj" am Ende. Die Koordinaten s,t aus der Matrix müssen nochmal durch durch die q Koordinate dividiert werden.
So müßte es auch ohne Texture Matrix und die projektiven Funktionen funktionieren:
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Danke für die Tipps, aber irgendwie steh ich entweder aufm Schlauch, oder irgendwo hakt bei glSlang etwas. Ich hab mich mal durchs Netz gewühlt und diesen Thread auf gamedev.net gefunden, in dem die Technik recht genau beschrieben wird. Den festen Teil hab ich ja bereits so gemacht (und der ging ja auch), und dann hab ich mal die dort von Yann L geposteten cG-Shader nach glSlang "portiert" (war ja recht popelig), aber die Reflektionen funzen trotzdem nicht. Hier mal die neuen Shader :
Die sind ja so simple, und die FF-Variante geht ja auch, so dass ich irgendwo schon langsam zur Überzeugung komme dass es da in glSlang selbst ein Problem mit den Texturmatrizen gibt, denn im Endeffekt dürfte obiger Shader ja nix anderes machen als die feste Pipeline auch tun würde, oder?
Ich bin mir nicht ganz sicher ob's daran liegen könnte aber gl_Vertex * gl_TextureMatrix[0] und gl_TextureMatrix[0]*gl_Vertex ist ja nicht dasselbe.
Eine Alternative wäre direkt die Koordinaten des Fragments zu skalieren und damit auf die Texture zu zugreifen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
LarsMiddendorf hat geschrieben:
Ich bin mir nicht ganz sicher ob's daran liegen könnte aber gl_Vertex * gl_TextureMatrix[0] und gl_TextureMatrix[0]*gl_Vertex ist ja nicht dasselbe.
*grml*, und seit Stunden bin ich am rumprobieren. Dickes Dankeschön für den Hinweis, nämlich genau DAS war das Problem. gl_TextureMatrix[0] * gl_Vertex; klappt wunderbar und es sieht jetzt mit dem Shader so aus wie es auch mit der FF aussehen sollte.
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Hallo,
nur eine kurze Frage:
Warum sind gl_Vertex * gl_TextureMatrix[0] und gl_TextureMatrix[0]*gl_Vertex nicht dasselbe, das geht jetzt über meinen mathematischen Horizont hinaus?
Danke,
La_Boda
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Hätt ich selbst mal genauer in die Specs gesehen, dann wäre mir auch Kapitel 5.10 aufgefallen (und Lars hätte mich nicht darauf hinweisen müssen ), in dem genau dass beantwortet wird :
Code:
The exceptions
are matrix multiplied by vector, vector multiplied by matrix, and matrix multiplied by matrix. These do
not operate component-wise, but rather perform the correct linear algebraic multiply. They require the
size of the operands match.
vec3 v, u;
mat3 m;
u = v * m;
is equivalent to
u.x = dot(v, m[0]); // m[0] is the left column of m
u.y = dot(v, m[1]); // dot(a,b) is the inner (dot) product of a and b
u.z = dot(v, m[2]);
And
u = m * v;
is equivalent to
u.x = m[0].x * v.x + m[1].x * v.y + m[2].x * v.z;
u.y = m[0].y * v.x + m[1].y * v.y + m[2].y * v.z;
u.z = m[0].z * v.x + m[1].z * v.y + m[2].z * v.z;
gl_Vertex * gl_TextureMatrix[0] wäre demnach also gl_Vertex DOT gl_TextureMatrix[0], und gl_TextureMatrix[0]*gl_Vertex eine komponentenweise Addition.
Das eine ist zeilenweise und das andere spaltenweise Multiplikation.
Ein Vektor ist ja auch eine Matrix und damit ist eine Multiplikation zwischen Vektor und Matrix ja eigentlich eine Matrizenmultiplikation. Und die Multiplikation zwischen Matrizen ist nicht kommutativ.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Bisher schien die Reflektion genauso so laufen wie es sollte, allerdings habe ich die Tage nen weiteren Testraum erstellt, aber dort liegt die reflektierende Wasserfläche nicht auf Null-Höhe, sondern recht weit unten und die Reflektion wie quasi an den Rändern abgeschnitten, wie auf folgendem Shot zu sehen :
Man sieht also nur einen Teil der Reflektion, der schwarze Teil sollte aber natürlich auch die Reflektion beinhalten. Ich habs jetzt ein paar Tage lang probiert hinzubiegen, aber ich hab echt keinen blassen Schimmer mehr was ich da machen soll. "Geholfen" hat eigentlich nur eine Erhöhung des FOVs für den "Spiegel", wodurch sich der abgeschnittene Bereich verkleinet hat. Aber ein FOV von 130° reicht dann trotzdem nicht, und das kann ja auch keine Lösung sein. Also hatt da evtl. jemand ne Idee zur Hand, wie man das korrekt lösen kann? Wäre über jede Hilfe dankbar, denn ich häng da jetzt schon recht viele Stunden dran.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ja, ich mein was total anderes. Da gibts keinen Schach, sondern nur eine Fläche die das was darüber ist spiegelt. Und das geht wie gesagt einwandrei solange die Fläche auf Y=0 liegt, ansonsten werden Teile beim Rendern in die Spiegeltextur weggeclippt, was dann nicht sein soll.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
OK, ich geb zu dass obiger Screenshot recht unaussagekräftig ist, weshalb ich mal ne neue Version nachliefere :
Wie man oben rechts sehen kann, wird die Textur (die die Spiegelung enthält) korrekt erstellt (sieht zumindest so aus), aber (siehe schwarze Fläche) die Texturkoordinaten für die Projektion der Spiegeltextur auf die Spiegelfläche werden nicht mehr korrekt generiert, sobald die Spiegelfläche nicht mehr bei y=0 liegt. Wenn man das genauer betrachtet, dann sieht es so als würden die Koordinaten gegen das Frustum geclippt, denn je nach Betrachtungswinkel sieht man den für ein Frustum typischen kegelförmigen Ausschnitt.
Hab mich jetzt auch stundenlang durchs Netz gearbeitet, und v.a. auf gamedev.net recht viel gefunden, aber in eigentlich jedem Thread wird davon ausgegangen dass sich dei Spiegelfläche bei y=0 befindet, was dann ja in der Beziehung keine Probleme macht. Das ist bei solchen Sachen wie ner Landschaft natürlich akzeptabel, aber ich will meine Wasserfläche gerne überall positionieren können.
Registriert: Sa Jan 04, 2003 21:23 Beiträge: 674 Wohnort: Köln
könntest du das Programm evtl. mal hochladen (da sieht man das dann noch etwas besser, auch wenn ich mir das ejtzt einigermaßen vorstellen kann, würde ich gerne das Verhalten bei Bewegung der Kamera/Szene mal sehen...)
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Nein, das Programm hat mit allem drum-und-dran weit über 30 MByte und braucht ne PS2.0-Karte, ausserdem ists noch alles andere als fertig. Von daher gibts da momentan nichts Hochladbares.
Registriert: Sa Jan 04, 2003 21:23 Beiträge: 674 Wohnort: Köln
ich dachte du hättest das Problem eh in ein Demotool gekapselt um einen FEhler, der woanders herkommt auszuschließen bspw..
dann ists auch egal..
man schaut doch in einem zylinder quasi nach unten, auf den screenshots, oder?
für mich sieht es irgendwie nicht aus, als ob der Boden das gleiche Niveau hat, auf dem auch der MAntel endet, das ist aber schon so, oder?
(wobei das ja nicht direkt mit dem eigentlichen Problem des "geclippten" zu tun hat...
nur sowas hätte man sich in Bewegung eben genauer anscheuen können und so kann man nur spekulieren
(bin z.Z. nicht zu Hause und auf der Radeon 9600(?) hier läuft sogar glsl usw. )
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.