Ich habe ein Terrain aus TRAINGLES_STRIPS gemacht und dazu die Normalen gesetzt. Leider sieht das Terrain aber sehr "fleckig" aus... Hier mal ein Bild:
Normalen werden in jedem Fall pro Vertex gespeichert. Du scheinst hier Per-Face-Normalen verwenden zu wollen, bei GL_TRIANGLES würde hier die Normale einfach dreimal gespeichert. Bei GL_TRIANGLE_STRIP ist das nicht so einfach möglich, da die Vertices ja wieder verwendet werden.
Empfehlung: Verwende Per-Vertex-Normalen, das sieht bei einem Terrain sowieso besser aus als Per-Face-Normalen. Berechne dazu für jeden Vertex den Durchschnitt aus den Normalen der 6 umliegenden Dreiecke. Wenn du willst kannst du auch noch eine Gewichtung z.B. nach Öffnungswinkel des Dreiecks am Vertex vornehmen. => So wirkt die Oberfläche wesentlich runder als sie eigentlich ist.
Falls du aus einem bestimmten Grund Per-Face-Normalen brauchst/willst, schau dir mal glShadeModel(GL_FLAT) an. Dort wird jeweils die Normale des letzten Vertex eines Dreiecks genommen.
Vielen Dank! Hab das mit den Per-Vertex-Normalen gemacht und es hat funktioniert . Aber das Terrain wirkt jetzt so "weich", man sieht nicht richtig die Tiefe, weil zu viel beleuchtet ist... Ist das normal? Oder kann ich da an den Normalen was verändern damit das "detalliertert" beleuchtet wird?
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Hat jetzt zwar nichts mit den Normalen zu tun:
Kann es sein, dass du die Dreiecke doppelt zeichnest?
In der 2. Schleife wird x jeweils um 1 inkrementiert. Dann werden 4 Punkte ausgegeben. Einmal mit x und einmal mit x+1.
Soweit ich mich an Strips erinnere, gibt man doch zu Beginn 2 Punkte aus, die den Anfang bilden. Danach immer nur 2 weitere für jedes Stück vom Strip. Sprich für 2 Dreiecke braucht man 4 Punkte. Für 4 Dreiecke braucht man 6 Punkte. etc.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das ist nicht richtig. Es wird für jedes(!) weitere Vertex ein neues Dreieck mit den beiden letzten Punkten des vorhergehenden Vertex erzeugt. Gut zu sehen ist das hier: glBegin
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
also entweder sind die normalen falsch berechnet, oder der Shader hat nen Fehler. Sieht so aus, als würde das Terrain mit zunehmender Entfernung vom Betrachter dunkler werden, was ja nicht ganz richtig ist. Ich würde mal darauf tippen, dass die falschen Vertexnormalen zusammen gerechnet wurden.
Sowas hab ich auch schonmal gemacht und hatte da ein ähnliches Problem. Am ende sah es dann aber so aus wie im angehängten Bild. Bei Bedarf schau ich heute Abend zu Hause gerne mal in meinen Sourcecode und guck ob ich da die entsprechenden Codezeilen ausfindig machen kann.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Vector.Normalize(&norm[0], &vec1); // Vektor normalisieren und in norm[0] speichern Vector.Normalize(&norm[1], &vec2); // Vektor normalisieren und in norm[1] speichern Vector.Normalize(&norm[2], &vec3); // Vektor normalisieren und in norm[2] speichern Vector.Normalize(&norm[3], &vec4); // Vektor normalisieren und in norm[3] speichern
Vector.Normalize(&norm[0], &vec1); // Vektor normalisieren und in norm[0] speichern Vector.Normalize(&norm[1], &vec2); // Vektor normalisieren und in norm[1] speichern Vector.Normalize(&norm[2], &vec3); // Vektor normalisieren und in norm[2] speichern Vector.Normalize(&norm[3], &vec4); // Vektor normalisieren und in norm[3] speichern
Das sieht so aus als würdest du die Vertexposition normalisieren und dann als Normale benutzen. Ich vermute das ist der Teil wo du Code ausgelassen hast. Allerdings würde es ziemlich genau deinen Screenshot erklären...die Normalen sind alle nahezu gleich, aber ändern sich doch...daher der leichte Farbverlauf.
// Normalen dieses Triangle_Strips zu den anderen Normalen hinzufügen Vector.Normalize(&normal[cnt][0], &vec1); Vector.Normalize(&normal[cnt][1], &vec2); Vector.Normalize(&normal[cnt][2], &vec3); Vector.Normalize(&normal[cnt][3], &vec4);
1. Du initialisierst die Variable cnt (wozu auch immer sie gut sein soll) mit 0 und teilst dann norm[*][*] durch cnt, also 0. Division durch Null! 2. Du betrachtest nur vier Vertices. Um die Normalen der umliegenden 6 Dreiecke eines Vertex zu berechnen musst du aber insgesamt 7 Vertices betrachten:
Dateianhang:
terrain.png
3. Du gibst pro Quad immer noch 4 Vertices aus, obwohl es nur zwei sein dürften (zuzüglich den beiden Startvertices)
Zitat:
Das klappt net ganz, weil manchmal ein Teil der Fläche komplett schwarz ist,
Das wird daran liegen das die Normalen falsch sind. Aber da hilft es dann auch nichts das Terrain mit Specular-Licht aufzuhellen . Zum aufhellen ist eigentlich auch das Ambient-Licht da.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Mitglieder in diesem Forum: 0 Mitglieder 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.