Ist nun zwar etwas Offtopic, aber nagut: Solltet ihr wirklich ein Tut dazu schreiben, dann setzt bitte keinen ganzen Mathe-Lk voraus... ich z.B. als (noch) 11 - Klässler kann mit unter solchen Begriffen wie "Normale", "Matrix", "Binormalvektor" (nen normalen Vector kenne ich *g*) oder auch "Scalarprodukt" reichlich wenig... Somit irgendwie auch kaum verwunderlich, dass ich fast keinen der Beiträge von Lars wirklich nachvollziehen konnte *heul*
_________________ Es sind immer die guten, welche zu früh von uns gehen müssen... Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net Neu! Ein großer Teil der Demos nach Kylix übersetzt!
Registriert: Sa Jan 04, 2003 21:23 Beiträge: 674 Wohnort: Köln
:/ bin auch noch in der 11. Klasse... aber soo schwierig ist das ja auch wieder nicht, alles... lern es eben außerhalb der Schule... sowas wie ne normale ist nun wirklich nicht schwierig....
schaus dir mal an, und wenn du damit programmierst, dann lernste das wie von selber
Der Normalvektor ist der Vektor der zu einer Fläche senkrecht steht und wird bei Lichtberechnung benötigt. Eine Matrix ist ein zweidimensionales Array von Zahlen. Man kann einen Vektor mit einer Matrix multiplizieren. Matrizen werden benutzt um viele verschiedene Rechenvorgänge wie Skalieren,Verschieben und Rotieren zusammenzufassen.
Ein Vektor v wird mit einer einer Matrix folgendermaßen multipliziert:
Diese Matrix hat 3 Zeilen und 4 Spalten und enthält Drehung,Skalierung und Verschiebung.
Da die w Koordinate meistens 1 ist entspricht die letzte Spalte der Matrix der Verschiebung der Punktes. Die anderen Spalten enhalten die Vektoren des neuen Koordinatensystem, in die der Vektor damit gebracht wird.
Es gibt Matrizen in allen Größen und es gibt außerdem noch viele weitere Operationen mit Matrizen. So kann man Matrizen z.B. invertieren oder miteinander verketten. Matrizen kann man auch für andere Dinge als Geometrie anwenden. So kann man Graphen auch als boolsche Matrix darstellen.
Dieser Artikel ist zwar in Englisch aber trotzdem vielleicht hilfreich: <a href='http://www.gamedev.net/reference/articles/article695.asp' target='_blank'>http://www.gamedev.net/reference/articles/.../article695.asp</a>
Ok, soweit hätte ich das auch noch eben geschaft, aber dann hört es leider bei mir auch auf... Kennt wer ne gute (hoffendlich Dt) Lektüre bzw. ne Internetsite, bei der man diese ganzen Fachbegriffe, auch einigermaßen Verständliche weise beigebracht bekommt? (naja: notfalls ware ich noch ein oder zwei Jahre... dann haben wir das Thema auch gehabt, aber mom ist mir das alles etwas zu hoch.....)
_________________ Es sind immer die guten, welche zu früh von uns gehen müssen... Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net Neu! Ein großer Teil der Demos nach Kylix übersetzt!
Man kann sich in vielen Schulen auch schon Mathe Bücher aus späteren Schuljahren ausleihen. Vielleicht kannst du da mal fragen. Zumindest bei uns war das so, dass Lineare Algebra ein eigenes Buch war. Dann hast du die Informationen um einiges genauer und detaillierter erklärt als in einem Tutorial und wenn ihr das dann in der Schule unterrichtet bekommt, kennst du außerdem schon die ganzen Aufgaben.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Also ich denke das mit dem Transformieren in den Tangentspace hab ich jetzt verstanden (auch den Grund warum). Danke schonmal. Trotzdem hapert's irgendwo noch immer Und ich hab heute bald keine Lust mehr...
Ich fasse hier mal meinen Code zusammen, vielleicht hat ja jemand Lust sich den anzutun und sieht den Fehler.
Ich habe in lpOS als Vector die Position der Lichtquelle gespeichert. Anschließend stelle ich das Shading auf GL_SMOOTH, Transformiere mein Object und setze die Texturestages und deren Env-Eigenschaften (mit den ziemlich sicher richtigen Parametern). Daraufhin wird für jedes Dreieck die Matrix für den Tangentspace erstellt und jeder Vertex so gerendert: <!--pas--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>Delphi-Source </td></tr><tr><td id='CODE'><!--pas1--><pre> // compute L lv[<span class='integer'>0</span>] := (lpOS[<span class='integer'>0</span>] - Vertices[Triangles[I].Vertices[<span class='integer'>0</span>]][<span class='integer'>0</span>]); lv[<span class='integer'>1</span>] := (lpOS[<span class='integer'>1</span>] - Vertices[Triangles[I].Vertices[<span class='integer'>0</span>]][<span class='integer'>1</span>]); lv[<span class='integer'>2</span>] := (lpOS[<span class='integer'>2</span>] - Vertices[Triangles[I].Vertices[<span class='integer'>0</span>]][<span class='integer'>2</span>]); VectorNormalize(lv);
// rotate into tangent space lv_ts := VectorTransform(lv, tangentMatrix);
<span class='reserved'>if</span> <span class='reserved'>not</span> UseCube <span class='reserved'>then</span> <span class='reserved'>begin</span> // scale <span class='reserved'>and</span> bias lv_ts[<span class='integer'>0</span>] := lv_ts[<span class='integer'>0</span>] * <span class='integer'>0.5</span> + <span class='integer'>0.5</span>; lv_ts[<span class='integer'>1</span>] := lv_ts[<span class='integer'>1</span>] * <span class='integer'>0.5</span> + <span class='integer'>0.5</span>; lv_ts[<span class='integer'>2</span>] := lv_ts[<span class='integer'>2</span>] * <span class='integer'>0.5</span> + <span class='integer'>0.5</span>; // use L <span class='reserved'>as</span> vertexcolor glColor3fv(@lv_ts); glMultiTexCoord2fARB(GL_TEXTURE0_ARB, s, t); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, s, t); <span class='reserved'>end</span> <span class='reserved'>else</span> <span class='reserved'>begin</span> // use L <span class='reserved'>as</span> texcoords <span class='reserved'>for</span> cubemap glMultiTexCoord3fvARB(GL_TEXTURE0_ARB, @lv_ts); glMultiTexCoord2fARB(GL_TEXTURE1_ARB, s, t); glMultiTexCoord2fARB(GL_TEXTURE2_ARB, s, t); <span class='reserved'>end</span>; glNormal3f(Triangles[I].Normal[<span class='integer'>0</span>], Triangles[I].Normal[<span class='integer'>1</span>], Triangles[I].Normal[<span class='integer'>2</span>]); glVertex3f( x, y, z);</pre><!--pas2--></td></tr></table><span class='postcolor'><!--pas3--> Also die Texcorrds und die Vertex-Positionen werden aus den entsprechenden Variablen genommen, hab ich jetzt nur der Einfachheit wegen weggelassen. Das ganze hab ich erst aus nem Sample von ATI gehabt (das auch einwandfrei läuft :huh: ), den Code mit der Cubemap entsprech aus deinen Postings oder anders zusammengesucht. Ich denke das ganze liegt noch immer am Berechnen des Lichtvektors. Den muss ich ja irgendwie immer in Relation zum Dreieck haben. Mir ist dabei bewusst, dass es mit meinem obigen Code nicht geht, wenn das Objekt bewegt wird, aber wenn ich die Lichtposition ändere passiert auch nicht wirklich was gescheites (entweder gar nichts, oder nur Quark, je nachdem, wie ich gerade rumgebastelt habe). Ich denke, dass ich bei dem ganzen einen groben Denkfehler habe. Habe in obigem Code jetzt mal die Transformation der Lichtquelle mit der umgekehrten ModelviewMatrix weggelassen. Damit funktioniert es auch nicht wirklich.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Nein, das ganze hab ich 3x, also für jeden Vertex des Dreiecks geschrieben. Dies war nur der erste. Bei den beiden anderen sind die Vertex und Texturkoordinaten, etc schon entsprechend angepasst.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Ich glaube ich hab jetzt (einen) meine(n/r) Fehler gefunden. Jedenfalls scheint jetzt alles zu funktionieren, wenn ich das ganze über die Vertexfarbe realisiere und das Objekt nicht verschiebe. Ich hatte anscheinend irgendwo bei der Normale ein Vorzeichen falsch. Allerdings funktioniert das ganze bisher nicht mit der Cubemap. Da scheine ich noch einen Fehler zu haben, aber das ist jetzt auch nicht so schlimm. Werde jetzt das ganze nochmal versuchen so hinzubekommen, dass man das Objekt auch verschieben und rotieren kann. Wenn ich das hinbekommen habe, kann ich, sofern Interesse besteht, ein kleines Beispiel-Prog mit dem Würfel zusammenstellen, etwas besser kommentieren und euch zur Verfügung stellen.
Trotzdem danke für deine Hilfe Lars, hab dadurch ja den Fehler mit dem Tangent-Space gelöst bekommen.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Hallo!
Wärme dieses alte Thema nochmal auf, da ich mich nach einiger Zeit jetzt selbst wieder an meinen Code gemacht habe. ich wollte dem ganzen Bumpmapping noch nen Speculareffekt verpassen und gucken, ob das mit der Rotation und Translation auch problemlos klappt.
Habe aber was den Speculareffekt angeht irgeneinen Fehler drin.
Wer eine ATI-Grafikkarte (8500 oder besser) hat, kann sich mal das kleine Beispielprogramm runterladen. Dort erstelle ich einen Würfel und realisiere mit VBO, EBO, ARB_Vertex_Shader und ATI_Fragment_Shader (die ARB-Variante kann meine Karte ja nicht) das Bumpmapping. Download beträgt etwa 2MB. Der Code sollte lesbar sein, werde ihn heute Abend nochmal besser kommentieren.
Wenn jemand den Fehler mit dem Speculareffekt findet, wäre es nett, wenn er mir (und den anderen hier) mitteilen würde.
Texturen habe ich jetzt mal welche aus nem ATI-Sample zum Thema genommen.
EDIT 18.9.: Habe die Version mal etwas geändert. Es gab wohl ein Problem mit den Tangenten. Diese kann man sich auch anzeigen lassen (einfach im Code wieder die Klammern entfernen in der GenderGeometry Procedure). Wer das Programm schon hatte kann sich auch nur die neuen Dateien besorgen: http://www.xxlsoft.com/Downloads/Changed.zip Jetzt scheint es noch ein Problem mit dem Licht und Kameravektor zu geben. Jedenfalls stimmt da etwas noch nicht (und ich frage mich, warum ich die Normalen für Ober- und Unterseite des Würfels umdrehen musste).
Vielleicht hat ja jemand Zeit sich das ganze Mal anzugucken. Ich seh vermutlich mittlerweile den Wald vor lauter Bäumen nicht mehr.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Hallo!
Hab noch eine Frage bezüglich der Cubemap zum normalisieren. Wenn man das ganze in einem Vertexprogramm berechnet, normalisiert man ja auch schon den Lightvector da. Brauch man dann noch eine Cubemap, oder hat diese Vorteile?
Achja, Specular-Bumpmapping haut noch immer nicht sauber hin
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Der Lichtvektor wird als Texturekoordinaten über das Dreieck interpoliert. Dabei kann es zur Denormalisierung kommen, wenn der Winkel zwischen einem Punkt des Dreiecks, der Lichtquelle und einem weiteren Punkt sehr groß ist. Angenommen das Vertex Programm würde für zwei Punkt die folgenden Lichtvektoren ausrechnen (1|0|0) und (-1|0|0). Das ist der Extremfall, wenn das Licht genau auf der Fläche liegt. Dann würde die lineare Interpolation zwischen Vektor1 und Vektor2 z.B. über (0.5|0|0) (0|0|0) und (0.5|0|0) führen.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Also setze ich dann den Lichtvektor als Texturkoordinate der Cubemap und lese dann den Farbwert der Cubemap an jeder Stelle im Fragmentprogramm für die weitere Berechnung als normalisierten Lightvector ein?
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
So geht es. Die Cubemap enthält an der Stelle (s,t,r) den Vektor (s,t,r). Eventuell muß du die Lichtvektoren noch entpacken. Bei den Register Combinern heißt das gl_expand_normal_nv. Vermutlich ist das bei ATI_fragment_shader ähnlich. Ich habe mir dein Programm angesehen, aber mit ATI_fragment_shader hab ich noch nie was gemacht, deshalb habe ich den Fehler auch nicht gefunden. Es gib da anscheinend ja ein speculares Licht wenn sich die Lichtquelle bewegt, aber irgendwie wird dann immer die ganze Fläche heller und es gibt nicht diesen Lichtpunkt.
Nur diffuses Licht kann man auch ohne Fragment Programme über texenv berechnen.
Registriert: Sa Okt 26, 2002 17:14 Beiträge: 188 Wohnort: Hannover/Lüneburg
Ich hab das ganze früher per Tex-Env gemacht, das klappte auch bis auf die Cubemap (die jetzt scheinbar auch hinhaut).
Das Fragment-Programm macht eigentlich nix aufregendes, steht ja in den Kommentaren. Beim Specularwert sorgt das 8x nur dafür, dass es halt x^8 ist, um den Effekt zu verstärken.
Ich vermute eher, dass entweder das Vertexprogramm den Eye oder Halfvector nicht richtig berechnet, oder aber Lichtvektor und Eyevektor schon falsch an das Vertexprogramm übergeben werden. Kannst dir ja auch die Normalen und Tangenten anzeigen lassen, die sollten aber stimmen. Trotzdem ist finde ich die ganze Beleuchtung komisch. Da werden die Seitenflächen zum Beispiel momentan gar nicht beleuchtet, obwohl die Lichtquelle ja um de Würfel rotiert.
Habe nochmal die Changed.zip aktualisiert, falls es jemanden interessiert.
_________________ Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?
Mitglieder in diesem Forum: Google [Bot] und 7 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.