Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 19, 2025 10:20

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jun 18, 2010 14:28 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Hallo zusammen,

Ich stehe vor folgendm Problem:

Wie im Bild zu erkennen habe ich zwei Balken auf gleicher Höhe.
Bei der Verbindungsstelle sieht man jedoch deutlich den Farbunterschied.

Das Licht wird auf den Beiden Balken ganz unterschiedlich reflektiert.
Ich habe keine Ahnung wieso.

In beiden Fällen habe ich glNormal3f(0.0f,1.0f,0.0f) innerhalb des
glBegin()/glEnd() Blocks aufgerufen.


Unklar ist mir, ob ich den Normalenvektor auch zuerst Nullen muss, oder ob das automatisch geschieht.

Weiter habe ich mit glEnable(GL_Normalize), bzw. glDisble(GL_Normalize) experimentiert,
aber das Programm hat sich dadurch nicht verändert.

Vielleicht liegt das Problem auch ganz wo anders.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 18, 2010 14:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Die Specular-Beleuchtung hängt auch von der Position des Fragments (bzw. Vertex) ab. Ist es vielleicht das?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 18, 2010 14:46 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Die Eckpunkte der beiden Vierecke liegen natürlich weit auseinander.
Aber daran lässt sich nichts ändern.

Konkret sieht das so aus:

//Die erste Fläche:

glBegin(GL_QUADS);
glNormal3f( 0.0f, 1.0f, 0.0f);
glVertex3f(1800,-72,40); // oben (vorderes Dreieck)
glVertex3f(1800,-72, -40); // oben (vorderes Dreieck)
glVertex3f(-1800,-72, -40); // oben (vorderes Dreieck)
glVertex3f(-1800,-72, 40); // oben (vorderes Dreieck)
glEnd();



//Die zweite Fläche

glBegin(GL_QUADS);
glNormal3f(0.0f, 1.0f, 0.0f);
glVertex3f(-40,-72,-990); // oben (vorderes Dreieck)
glVertex3f(40,-72,-990); // oben (vorderes Dreieck)
glVertex3f(40,-72,2490); // oben (vorderes Dreieck)
glVertex3f(-40,-72,2490); // oben (vorderes Dreieck)
glEnd();

Allerdings stehen diese beiden Blöcke nicht untereinander, sondern befinden sich in unterchiedlichen Funktionen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 01:30 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich denke schon, dass das ein Problem ist.

Angenommen die Eckpunkte eines der Balken sind sehr weit weg, dann wird die resultierende Farbe an den Eckpunkten ermittelt und dann über den gesamten Balken interpoliert.
Wenn dein Balken in der Mitte eigentlich viel nächer zur Lichtquelle ist, als die Eckpunkte, wird er trotzdem nicht heller gezeichnet.
Einzige Lösung für Std.OpenGL-Licht ist das Aufteilen deiner Flächen in kleinere Segmente.
Oder aber du verzichtest auf Licht und zeichnest die dinger einfach mit normalem Shading.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 08:46 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Nun bin ich aber enttäuscht über opengl.

Wisst ihr wo die Gründe dafür liegen?
Es scheint mir nicht so kompliziert zu sein, einen Lichtstrahl nach den Lehrsätzen der geometrischen Optik zu simulieren.
Würde dies zu viel Rechnungsleistung erfordern, oder gibt es andere Gründe, weshalb dies nicht so gemacht wird?

Oder hat es etwa einfach noch niemand gemacht?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 10:28 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Als OpenGL auf den Mark kam, waren Grafikkarten nicht die Rechenmonster die sie heute sind.
Es gab in der Forschung verschiedene Beleuchtungsmodelle. Man hat sich für das Phong-Modell entschieden.
Das Phong Modell beschreibt aber nur, wie die Darstellung an einem definierten Punkt des Objekts ist.

Zur damaligen Zeit wäre es der Overkill gewesen, wenn man versucht hätte, die Beleuchtung für jedes sichtbare Pixel zu berechnen. Also entschied man sich für die performante Lösung, die Beleuchtung nur für die Eckpuknte zu berechnen, und dazwischen zu interpolieren.
Der Entwickler kann, falls es nötig ist, dann seine Objekte mit mehr Vertices aufbauen, wenn er eine genauere Lichtberechnung haben möchte.

Für dich heißt das konkret, dass du mit Std.OpenGL Licht, deine Kisten höher auflösen musst. D.h. dein Gittermodell muss dichter werden.

Eine andere alternative brachten Shader mit. Hier gibt es die möglichkeit eine Per-Pixel-Beleuchtung (PPL) zu programmieren. Falls Shader für dich eine Option sind, findest du einen Beispiel PPL Shader im Wiki in der Shadersammlung.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 11:33 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Vielen Dank für deine Antwort Flash.
Jetzt, da ich die Ursache kenne, gibt es verschiedene Möglichkeiten das Problem zu lösen.

Zum Schluss noch folgende zwei Fragen:

Was bedeutet folgender Befehl:

glNormal3f(1,3,2);
glNormal3f(0,0,4);

Werden die Beiden Vektoren zusammenaddiert, oder wird der erste mit dem zweiten überschrieben?



Zweite Frage: Wie lösen CAD Programme das Problem?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jun 19, 2010 12:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Zitat:
Werden die Beiden Vektoren zusammenaddiert, oder wird der erste mit dem zweiten überschrieben?


der erste wird von dem zweiten ersetzt.

(zusammenaddieren würde auch wenig Sinn machen. dann müsstest du spätestens am Ende eines Renderpass die Normale nachberechnen und wieder abziehen, sonst würden sich die Normalen mit der Zeit ändern)

mfg

Sharkman


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jun 20, 2010 07:47 
Offline
DGL Member

Registriert: Do Jun 17, 2010 10:45
Beiträge: 36
Vielen Dank euch alle,
ich habe schon wieder etewas gelernt


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]