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

Aktuelle Zeit: Di Jul 15, 2025 09:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Farbgebung und Beleuchtung
BeitragVerfasst: Di Apr 01, 2008 15:32 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Hallo zusammen,

ich bin eigentlich der Ansicht, wenn ich einen Volumenkörper zeichne und vorher eine Farbe definiert habe, dann sollte er bei weißer Beleuchtung auch in der zuvor definierten Farbe zu sehen sein. Ist aber bei trotzdem weis. Woran liegt es?


Code:
  1.   const
  2.     SpAmb : Array [0..3] of glFloat = (0.2, 0.2, 0.2, 1.0);
  3.     SpDif : Array [0..3] of glFloat = (1.0, 1.0, 1.0, 1.0);
  4.  
  5.     ...
  6.  
  7.     glMaterialfv(gl_FRONT_AND_BACK, GL_AMBIENT, @spAmb);
  8.     glMaterialfv(gl_FRONT_AND_BACK, GL_DIFFUSE, @spDif);
  9.     glColor3i(0,255,0);
  10.     gluSphere(Kugel,1e5,24,12);


Wenn ich natürlich die Materialwerte für ambiente und diffuse Reflektion auf die entsprechende Farbe setze, dann klappts. aber es müsste doch auch mit "glColor*" funktionieren, oder?


Ich habe noch einen weiteren Körper mit DrawElements aus gl_quads aufgebaut. Die Geometrie nehme ich aus einem Vertexarray. Beleuchtungsbedingungen sind die selben wie oben, aber er zeigt keinerlei Farbschattierungen. Sieht aus als würde er 100% ambientes Licht bekommen. Wie kommts?

Marcel

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Also, wenn ich mich recht erinnere ist es so, dass die Beleuchtung glColor im prinzip ersetzt (schreit, wenn ich mich täusche). So gesehen ist es nicht weiter verwunderlich, dafür sind ja dann auch die Materialien da. Wenn du kein Material setzt, dann kann es evtl. sein, dass glColor noch funktioniert. Wenn du trotzdem was glColor-artiges anstellen willst schau dir mal glSecondaryColor an.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 17:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Ich habe das jetzt so verstanden, dass wenn GL_COLOR_MATERIAL aktiviert ist die mittels glMaterial gesetzten Werte verwendet werden. Falls deaktiviert dann nur glColor.

_________________
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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 17:29 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ich hab noch was zu meinem Volumenkörper aus dem Vertexarray hinzuzufügen. Er besteht aus mehreren quaderförmigen Gebilden, zusammengesetzt aus insgesamt ca 40 quads. Wenn ich ihn rotieren, lasse verdunkelt sich der ganze Körper gleichermaßen. Ich hätte aber halt gerne das sich die einzelnen Flächen entsprechen ihrer Stellung zur Lichtquelle verhalten. Wie es scheint nutzt der ganze Körper nur einen Normalenvektor. Wieso das denn? Backface-Culling funktioniert, also müssten die einzelnen Flächennormalen doch auch bekannt sein.

GL_COLOR_MATERIAL muss glaube ich nur aktiviert werden, wenn eine einzelne Materialeigenschaft verändert werden soll. Also nur ambient oder nur specular.

_________________
Just do it!


Zuletzt geändert von hefekuchen am Di Apr 01, 2008 17:33, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Die Normale hat nichts mit dem Culling zu tun. Beim Culling wird nur die Zeichenrichtung berücksichtigt. Mit bzw gegen den Uhrzeigersinn.

Du musst zu jedem Quad noch die entsprechende Normale angeben.

_________________
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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 17:48 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
OK, dann kann ich aber glaube ich nicht mit einem Vertexarray arbeiten. Denn jedes Vertex wird unter Umständen von mehreren rechtwinklig aufeinander stehenden Flächen verwendet, die Normale müsste also in unterschiedliche Richtungen zeigen.

Oder kennt jemand eine Möglichkeit die Flächen anzusprechen und ihnen eine Normale zuzuweisen?



Code:
  1.  
  2. const
  3.   Vertices : Array [0..xy] of glFloat = (...
  4.                  ...);
  5.  
  6.   BodyIndices : Array [0..31] of gluByte = (
  7.                 0,  4,  7,  3,     // Surface  1
  8.                 3,  7,  6,  2,     // Surface  0
  9.                 8,  9, 10, 11,    // Surface  4
  10.                 1,  5,  4,  0,     // Surface  3
  11.                 0,  3,  2,  1,     // Surface  5
  12.                 4,  5,  6,  7,     // Surface  6
  13.                 2,  6,  9,  8,     // Surface 10
  14.                 1, 11, 10,  5);  // Surface  9
  15.  
  16. ...
  17.  
  18. procedure SetupGL;
  19. begin
  20.   glVertexPointer(3,GL_FLOAT,0, @Vertices);
  21. end;
  22.  
  23. ...
  24.  
  25.   glDrawElements(GL_QUADS, 32, GL_UNSIGNED_BYTE, @BodyIndices);

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 19:51 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
passend zu glVertexPointer gibts doch auch glNormalPointer. Redbook Seite 69 ff. :)

_________________
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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 01, 2008 22:58 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ja, das ist wohl richtig. Aber irgendwie scheine ich da auf dem Schlauch zu stehen. Wie kann ich denn die Normalen den Flächen zuweisen? Auf die einzelnen Flächen kann ich doch so einfach gar nicht zugreifen denn die werden doch mit einem Prozeduraufruf mit glDrawElements erzeugt.
Auf Flächen kann ich ja eigentlich sowieso keine Normalen anbringen, sondern nur auf die Vertices. Aber bei einem Würfel gehört ein Vertex zu drei Seiten, welche auch noch rechtwinklig zueinander stehen. Demnach kann ich auch nicht wie im Redbook Vertices und Normalen in ein Array unterbringen (interleaved Arrays). Dachte eigentlich das opengl die Normalen per default übernimmt, und zwar abhängig von der Reihenfolge wie die Vertices gezeichnet werden (Rechte Hand Regel).

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 02, 2008 15:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du gibst doch auch sonst pro Vertex eine Normale an. Wie man die berechnet weiss ich nicht, war glaube ich was mit Produkt aus den anliegenden Flächen oder so.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 02, 2008 16:25 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Ah, ja. Habe inzwischen entdeckt das per default bei OpenGL die Normale immer in z-Richtung liegt. Dann ist klar das die Normalen definiert werden müssen. Ich hatte im Hinterkopf das in der Computergrafik die Zeichenreihenfolge der Vertices die Normale des Polygons (Dreieckes) angibt. Mir ist zwar immer noch nicht so ganz klar wie man mit Hilfe eines Array z.B. einen Würfel mit Schattierung rendern soll. Oder man setzt auf jede Ecke eine Vertex für jede angrenzende Fläche und weist dieser dann den richtigen Normalenvektor zu. Falls noch jemand diesbezüglich Tipps hat bin ich dankbar für jeden Post.

Zur Normalenberechnung:
Kreuzprodukt zweier in der Ebene liegender Vektoren. Also beim Dreieck mit den Spitzen V1, V2 und V3:
(V2-V1) x (V3-V1)

Vielen Dank erst mal, die Beleuchtungsgeschichte sehe ich jetzt jedenfalls um einiges klarer.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 02, 2008 17:41 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Die normale ergibt sich aus der Reihenfolge der Vertexe. Gibt man Sie gegen den Uhrzeiger an Zeigt die Normale auf einen. Das Culling orientiert sich deshalb durchaus an der Normalen. Aber eher indirekt.
Wenn die Normale per Hand anders gesetzt ist dann ... dann ... weis ich nicht was passiert. Setzt doch mal die Normale andersrum und guckt ob Culling dann anders Cullt. Falls Ja wäre ein Eintrag im Wiki die richtige Reaktion. Falls nicht wäre ein Eintrag im Wiki die richtige Reaktion. ;)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 03, 2008 23:36 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Dass die Reihenfolge der Vertices die Normalenrichtung bestimmt kenne ich auch so. Darum war ich ja erstaunt das opengl aus meinem Volumenkörper, den ich aus mehreren Polygonen zusammengesetzt hatte, ein 'Etwas' ohne Schatten gemacht hat. Als ich dann mein Objekt im Licht rotieren lies, stellte ich fest das die Polygone sehr wohl in Abhängigkeit vom Winkel schattiert werden. Aber alle gleich. Also es gab nur eine Normale für alle Polygone. Und im Wiki steht das per default der Normalenvektor (0,0,1) ist http://wiki.delphigl.com/index.php/glNormal.
Das mit dem Culling bei umgekehrter Normale werd ich am WE mal ausprobieren.

_________________
Just do it!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 04, 2008 09:05 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
afaik setzen die vertizes keine (echte) normale. Aus ihnen wird nur eine temporäre normale berechnet fürs backfacecullling.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 04, 2008 10:34 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Wie auch immer.

Ich spare mir den ganzen Kram mit Arrays für Normalen etc.
Wozu gibts denn Shader? Mein Shader arbeitet mit 4 Texturunits.
Farbtextur, Highlighttextur (für Glow), AmbientOcclusion Texture und eine Normaltextur. Wenn man das UV-Mapping anständig hinbekommt sieht das sehr schön aus.
Hier ist jetzt nur die Normalmap und AmbientOcclussion aktiv und das UV ist noch nich so perfekt. :)

_________________
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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 04, 2008 22:05 
Offline
DGL Member

Registriert: Mo Okt 15, 2007 18:30
Beiträge: 74
Wohnort: Berlin
Sieht toll aus, dein Bild mit der Shader-technik. Aber ich hab ja nicht umsonst im Einsteigerforum gepostet. Hab erst vor kurzem mit OpenGL angefangen und brauche noch ein paar basics und Hintergrundwissen bis ich mit Shadern anfange. :wink:

_________________
Just do it!


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.010s | 16 Queries | GZIP : On ]