Registriert: Di Feb 10, 2004 14:55 Beiträge: 28 Wohnort: Gelsenkirchen
Hi Leute,
ich habe mir mit
Code:
glBegin(GL_POLYGON);
for i:=1 to 360 do
begin
glVertex3f(cos(i),sin(i),0);
glVertex3f(cos(i),sin(i),2);
end;
glEnd;
einen Zylinder gebastelt. Allerdings kann man bei dem Zylinder keine Kante erkennen. Nun wollte ich ihn mit Licht beleuchten, sodass der Zylinder auch als solcher erkennbar ist, das hab ich mit dem Code aus dem tutorial gemacht:
Code:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightf(GL_LIGHT0,GL_POSITION,0);
Allerdings wird mien Zylinder dann grau (er war vorher grün) und ich kann immer noch keine Kanten erkennen.
Mache ich einen Denkfehler?
mfg, martin
_________________ Behaupten ist sicherer als Beweisen.
Meine OGL-Projekte
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Bei Beleuchtungen musst du immer auch noch die Flächennormale miteinbeziehen. Was die Normale genau ist und wie du sie berechnest, kannst du im Wiki nachlesen.
Hast du sie berechnet, gibst du sie einfach per glNormal3f für jedem glVertex3f an. Du würdest dich außerdem leicher tun, wenn du mit Quads oder Triangles anstatt mit GL_POLYGON arbeitest.
_________________ "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: Di Feb 10, 2004 14:55 Beiträge: 28 Wohnort: Gelsenkirchen
La Boda hat geschrieben:
Bei Beleuchtungen musst du immer auch noch die Flächennormale miteinbeziehen. Was die Normale genau ist und wie du sie berechnest, kannst du im Wiki nachlesen.
Ist es hierbei egal, wie die Orientierung der Normalen ist. Ich meine der Normalenvektor kann doch immer noch 2 Richtungen haben?!
La Boda hat geschrieben:
Hast du sie berechnet, gibst du sie einfach per glNormal3f für jedem glVertex3f an.
Kannst du mir dazu ein Beispiel geben? Mussich jetzt vor jedem Aufruf von glVertex3f erst die entsprechende Normale einstellen, oder wie ist das gemeint?
La Boda hat geschrieben:
Du würdest dich außerdem leicher tun, wenn du mit Quads oder Triangles anstatt mit GL_POLYGON arbeitest.
Tja, aber ich fand es irgendwie kompliziert mit rechteckigen, bzw. dreieckigen Figuren etwas rundes zu erschaffen. Ich weiß wohl, dass ich mich an den Gedanken gewöhnen muss. Gibt es da Code zu, oder sollte ich mir erstmal aus Quad-Streifen einen Zylinder basteln ... Wobei der Deckel und der Boden schwierig werden *grübel*
_________________ Behaupten ist sicherer als Beweisen.
Meine OGL-Projekte
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Nein, eine Normale hat nur eine Richtung, wie alle Vektoren. Nur die Länge variiert, sollte aber bei Beleuchtungen immer 1 betragen.
glNormal3f wird innerhalb von glBegin...glEnd aufgerufen und bleibt für alle folgenden Vertices aktiv, bis wiederum glNormal3f aufgerufen wird. Für eine Fläche bleibt die Normale natürlich gleich. Deswegen musst man bei Triangles für drei Vertices nur einmal die Normale angeben.
Ein Beispiel:
Code:
glBegin(GL_TRIANGLES);
glNormal3(0,0,1);
glVertex3f(0,0,0);
glNormal3(0,0,1);
glVertex3f(1,0,0);
glNormal3(0,0,1);
glVertex3f(1,1,0);
glEnd;
ist gleichbedeutend mit
Code:
glBegin(GL_TRIANGLES);
glNormal3(0,0,1);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glVertex3f(1,1,0);
glEnd;
Letzteres ist natürlich schneller, da du dir ein paar unnütze Funktionsaufrufe sparst.
_________________ "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: Di Feb 10, 2004 14:55 Beiträge: 28 Wohnort: Gelsenkirchen
Heyho,
war dann mal etwas fleißig und habe mir jetzt aus Quads und Triangles einen Zylinder gebastelt:
Code:
for i:=1 to 360 do
begin
glBegin(GL_QUADS);
glVertex3f(cos(i),sin(i),0);
glVertex3f(cos(i+1),sin(i+1),0);
glVertex3f(cos(i+1),sin(i+1),2);
glVertex3f(cos(i),sin(i),2);
glEnd;
glBegin(GL_TRIANGLES);
glVertex3f(cos(i),sin(i),0);
glVertex3f(cos(i+1),sin(i+1),0);
glVertex3f(0,0,0);
glEnd;
glBegin(GL_TRIANGLES);
glVertex3f(cos(i),sin(i),2);
glVertex3f(cos(i+1),sin(i+1),2);
glVertex3f(0,0,2);
glEnd;
end;
Wenn ich diesen Zylinder jetzt beleuchten will, muss ich also für jedes Quad und für jedes Triangle einen Normalenvektor bilden, den Einheitsnormalenvektor berechnen und den dann als Normale einstellen?
Und gibt es dazu irgendwelche nützlichen Funktionen oder muss ich mich da selbst bemühen, mit Kreuzprodukt, etc.?
Danke soweit für die Hilfe
mfg, martin
_________________ Behaupten ist sicherer als Beweisen.
Meine OGL-Projekte
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Naja, die Funktionen sind ja schnell geschrieben, du kannst aber auch die ausm Wiki nehmen.
_________________ "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: Di Feb 10, 2004 14:55 Beiträge: 28 Wohnort: Gelsenkirchen
So, hab jetzt die ganzen Normalenberechnungen jeweils implementiert, jetzt hab ich noch folgende Probleme:
1) Zeigt er mir den Fehler "invalid enumerant" an. (Suche und Wiki kennen den Fehler nicht)
2) sind irgendwie alle Farben in Grautöne umgewandelt.
Mit meinem Zylinder bin ich eigentlich zufreiden, auch wenn ich damit nur 8fps mache und im Endeffekt ca. 15 Zylinder in einer Szene haben werde, aber naja. Bis hierhin ist es ganz gut gegangen, aber ich hab echt keinen Plan, was jetzt schief läuft, eventuell zeigen die Normalen in die falsche Richtung oder so, dann multipliziere ich sie einfach mal mit -1 ...
Hoffe ihr könnt helfen, danke im Voraus, mfg Martin
Hier mal meine aktuelle Render-Prozedur:
Code:
procedure TMyOpenGL.Render;
var i : integer;
tmpVector : TVector;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenbuffer löschen
Das macht aber wenig Sinn, weil die Flächen dann genau die gleich sind. Dass die Beleuchtung nicht wie gewünscht hinhaut, kann entweder daran liegen, dass die Lichtquelle sich an einer falschen Position (zB innerhalb des Zylinders) befindet oder die Normalen in die falsche Richtungzeigen. Letzteres kann daher kommen, dass du deine Vektoren der Vertices in der falschen Reihenfolge bei der Normalenberechnung verwendest.
_________________ "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: Di Feb 10, 2004 14:55 Beiträge: 28 Wohnort: Gelsenkirchen
So, hab jetzt wieder bissel Zeit an dem Projekt zu arbeiten.
La Boda hat geschrieben:
Folgende Sachen fallen mir in dienem Code auf: Du zeichnest komischerweise alle Flächen einmal mit GL_QUADS und dann mit zwei GL_TRIANGLES nochmal: Das macht aber wenig Sinn, weil die Flächen dann genau die gleich sind.
Die Quads bilden den Zylindermantel, die Triangles bilden den Deckel und den Boden, sind in so fern schon wichtig.
La Boda hat geschrieben:
Dass die Beleuchtung nicht wie gewünscht hinhaut, kann entweder daran liegen, dass die Lichtquelle sich an einer falschen Position (zB innerhalb des Zylinders) befindet oder die Normalen in die falsche Richtungzeigen. Letzteres kann daher kommen, dass du deine Vektoren der Vertices in der falschen Reihenfolge bei der Normalenberechnung verwendest.
Ich hab jetzt einfach mal an einem Viereck im Hintergrund das Ganze ausprobiert. Ich glaube, dass mein Licht an einer falschen Position ist, bzw. in eine falsche Richtung leuchtet oder so. Aber sollte bei einem Aufruf von
Code:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightf(GL_LIGHT0,GL_POSITION,0);
nicht so eine Art "Sonne" erstellt werden, die alles beleuchtet? Oder muss ich mir die SOnne auch noch irgendwohin verschieben?
_________________ Behaupten ist sicherer als Beweisen.
Meine OGL-Projekte
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Wie du die Position der Lichtquelle setzt, kannst du in diesem Tutorial nachlesen: Tutoiral lektion8
Mir ist jetzt noch aufgefallen, an was die Performanceeinbußen liegen könnten. Deine Funktion getNormal(...) berechnet die Normalen. Höchstwahrscheinlich normierst die sie auch gleich in dieser Funktion, bringst sie also auf die Länge 1. Dazu ist es ja nötig, dass die Wurzel gezogen wird. Und DAS ist wirklich sehr anspruchsvoll für die CPU. Du müsstest pro Frame 360 * 3 = 1080 mal die Wurzel ziehen, und bei sowas tut sich die CPU sehr hart. Du solltest also die Normalen entweder nur beim Initialisieren berechnen und dann zB in ein Array abspeichern oder du arbeitest mit Displaylisten
_________________ "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
Wenn man die Normalen selbst berechnet, braucht man sie aber nicht unbedingt zu normalisieren. Wenn GL_NORMALIZE mit glEnable eingeschaltet wird, erledigt die OpenGL-Implementation das, was dann eventuell hardwareeschleunigt ist.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo,
bei statischen Objekten würd ich generell mit Displaylisten arbeiten.
Von daher ist die Wurzelberechnung nicht weiter schlimm, da in der Liste nur das berechnete Ergebnis abgespeichert wird.
und was GLU betrifft : die Bibliothek (welche ja nichts weiter macht als bestehende OpenGL-Befehle zusammenzufassen) mag zwar nicht mehr auf dem allerneuesten Stand zu sein, kann einem aber ab und zu viel (überflüssige) Arbeit abnehmen
Mitglieder in diesem Forum: 0 Mitglieder und 16 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.