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

Aktuelle Zeit: Mo Jul 14, 2025 23:50

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 11, 2009 19:21 
Offline
DGL Member

Registriert: Sa Jun 06, 2009 16:13
Beiträge: 17
Wohnort: Künzelsau
nee darum gehts ja nicht ich würds nur kenn können (besser als nicht können).

und genau das was du gesagt hast (dass es nur ein Richtungsvektor ist) irritiert mich ja.
Mein GL muss ja irgenwoher wissen wo jetzt dieser Vektor anzulegen ist.

Das Hauptproblem ist, dass ich nicht weiß an welcher Stelle Meines Programms ich die Funktion aufrufen muss.

_________________
Wieso kann es nicht einfach funktionieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 11, 2009 20:56 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
OpenGL ist eine Statemachine. Wenn du glNormal aufrufst, dann setzt du diese Normale für alle folgenden Vertices bis wieder eine andere Normale gesetzt wird. Du setzt also immer direkt vor glVertex deine Normalen mit glNormal

Stell dir einfach vor, die Normale geht aus dem Vertex raus.

OpenGL interpolliert dann zwischen den Normalen der Vertices die an einer Fläche liegen. Damit werden dann quasi die Normalen innerhalb der Fläche "simuliert". Shader nutzen diese für fein strukturierte Oberflächen. Die berechnen die Normalen in der Fläche einfach anders und raus kommt z.B. eine rauche Oberfläche mit kleinen Knubbeln. Und das ohne zusätzliche Vertices, einfach durch "geschwindelte" Normalen.

Wenn du richtig harte Kanten willst musst du sogar mehr Aufwand betreiben als bei weichen, da du alle Vertices an der Kante doppelt rendern musst. Einmal mit der Normale für die eine Fläche und einmal mit der für die andere.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jun 11, 2009 21:39 
Offline
DGL Member

Registriert: Sa Jun 06, 2009 16:13
Beiträge: 17
Wohnort: Künzelsau
Ums auf den Punkt zu bringen:
Ich bekomms nicht gebacken!

Hier mal meine Pyramide die wenigstens doch etwas Stumpf werden soll:
Code:
  1.  
  2.     glBegin(GL_TRIANGLE_Fan);
  3.     glnormal3f(0,1,0);
  4.     glVertex3f( 1, 0.5, 1);
  5.     glVertex3f( 0, 0, 0);
  6.     glVertex3f( 2, 0, 0);
  7.     glVertex3f( 2, 0, 2);
  8.     glVertex3f( 0, 0, 2);
  9.     glVertex3f( 0, 0, 0);
  10.  
  11.   glEnd();


Es geht nicht.
Ich hab keine Ahnung warum.
Ich hab langsam keine lust mehr.
Wenn so weiter geht lass ichs und mach mit was anderem weiter!

Trotzdem Danke für die Geduld und deine Bemühungen Flash!!!

_________________
Wieso kann es nicht einfach funktionieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 12, 2009 06:31 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
ist ja auch kein wunder, dass es so nicht funktioniert. In deinem geposteten Codeschnipsel zeigt die normale an ALLEN Eckpunkten deiner Pyramide nach oben, das ist aber nicht richtig, denn die Flächen zeign ja garnicht nach oben. Einzige möglichkeit die du hast ist, vor JEDEM glVertex3f(); aufruf auch glNormal3f(); aufzurufen und für jeden Eckpunkt anzugeben, in welche Richtung er zeigt. Da du deine Pyramide ja oben stumpf haben willst ist der oberste Punkt der einzige mit einer Normalen die nach oben zeigt, alle anderen stehen senkrecht auf ihrer Fläche und zeigen vom Mittelpunkt der Pyramide über die Ecken nach Außen.

PS: Im übrigen wird das Licht auch nicht sooo prall auf der Pyramide aussehen, da OpenGl Licht zwischen den Eckpunkten das Licht interpoliert und so kann es sein, dass die Oberfläche etwas merkwürdig aussieht. Je mehr vertices du in einem Objekt verbaust um so genauer ist das OpenGl Licht. Probier das mal mit einer einfachen Fläche aus, die mal aus nur einem Quad und mal aus 16 oder sogar 64 Quads besteht und lass eine OpenGl Lichtquelle darüber hin- und herfahren. Da sieht man dann den sogenannten Goraud-Shader in action. Sollte es noch hapern mach ich dir mal n Beispiel.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 12, 2009 08:15 
Offline
DGL Member

Registriert: Sa Jun 06, 2009 16:13
Beiträge: 17
Wohnort: Künzelsau
um es zu vervoll ständigen:
Code:
  1. glEnable(GL_NORMALIZE);
  2.   glBegin(GL_TRIANGLE_Fan);
  3.     glnormal3f(0,-1,0);
  4.     glVertex3f( 1, 0.5, 1);
  5.  
  6.     glnormal3f(-1,0,1);
  7.     glVertex3f( 0, 0, 0);
  8.  
  9.     glnormal3f(1,0,1);
  10.     glVertex3f( 2, 0, 0);
  11.  
  12.     glnormal3f(1,0,-1);
  13.     glVertex3f( 2, 0, 2);
  14.  
  15.     glnormal3f(-1,0,-1);
  16.     glVertex3f( 0, 0, 2);
  17.  
  18.     glnormal3f(-1,0,1);
  19.     glVertex3f( 0, 0, 0);
  20.  
  21.     glEnable(GL_NORMALIZE);
  22.  
  23.  
  24.   glEnd();
  25.  


So hab ichs auch schon versucht und es kam nix zu stande...

_________________
Wieso kann es nicht einfach funktionieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 12, 2009 10:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du solltest aber bei diesem Stück Code auch eine OpenGL Fehlermeldung erhalten. Checkst du die? (Im Quickstart ist da eine simple Methode beschrieben.)

glEnable darf innerhalb glBegin/End nicht aufgerufen werden.

Außerdem hat Sellmann recht. Die Pyramide ist sehr grob unterteilt und wirklich viel sehen kannst du da nicht. Die Standardbeleuchtung orientiert sich nicht an der Größe der Fläche (also den Pixeln) sondern an der Anzahl der Eckpunkte (Vertex). Sie wird umso genauer, je feiner die Objekte strukturiert sind.
Eine Pixelorientierte Beleuchtung bekommst du nur mit Shadern hin. Das ist aber ein ganz anderes Kalliber.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 12, 2009 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Wie stellst du denn deine Lichtquelle ein? Wann und wie aktivierst du sie? Was mir aufgefallen ist: Du zeichnest deine Pyramide falsch herum. Ich habe deine Methode übernommen und ausprobiert und bei mir sind die Innenseiten der Pyramide zu sehen gewesen. Wenn du kein Backface-Culling eingeschaltet hast ist das aber egal.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jun 15, 2009 16:52 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
glNormal enthält jetzt dank Sascha ein Bild welches anzeigt was geglättete Normalen bringen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 04, 2009 20:20 
Offline
DGL Member

Registriert: Sa Jun 06, 2009 16:13
Beiträge: 17
Wohnort: Künzelsau
Musste zwecks Klausuren ne kleine Pause einlegen...

Bin jetzt aber wieder am Start... Wort wörtlich leider.

Code:
  1.  
  2. glEnable(GL_NORMALIZE);
  3.   for i := 0 to 10 do
  4.     begin
  5.     glBegin(GL_QUAD_STRIP);
  6.     glnormal3f(1,0,0);
  7.     glVertex3f( 1, 0, i);
  8.     glnormal3f(1,0,0);
  9.     glvertex3f( 1, 0, (i+1));
  10.     for j := 0 to 12 do
  11.       begin
  12.       glnormal3f(cos(j*PI/6),sin(j*PI/6),0);
  13.       glVertex3f( cos(j*PI/6), sin(j*PI/6), i);
  14.       glVertex3f( cos(j*PI/6), sin(j*PI/6), (i+1));
  15.       end;
  16.     glEnd;
  17.     end;
  18.  


hab das so mal versucht das liche ändert sich drastisch (immerhin) aber die glättung, also dass der zylinder nich mehr ganz so eckig aussieht geht noch nich so wie ich mir das vorgestellt habe. wenn ich mehr slices mache gehts trotzdem noch nicht...

bitte helft!

€dit:

mir is grade aufgefallen, dass in der mitte des Zylinders das gar nich so schlimm aussieht
=> kann es sein dass OGL an den Kanten Probleme hat?

_________________
Wieso kann es nicht einfach funktionieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 05, 2009 09:54 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Ich hab hier nur den Code von damals, den ich mir aus dieser Fragestellung heraus gebaut habe. Er operiert auf einem Gitter. Ich hoffe damit kannst du etwas anfangen:
Code:
  1.   function CalculateNormal(i0, j0: integer): TVector3f;
  2.   const
  3.     nMatrix: array[0..4, 0..1] of integer = ((0, 0), (0, 1), (1, 0), (0, -1), (-1, 0));  // beschreibt die Position der umliegenden Vertices
  4.   var
  5.     i, j,
  6.     i1, j1,
  7.     c: integer;
  8.     tr: array[0..4] of TVector3f;
  9.     trb: array[0..3] of boolean;
  10.   begin
  11.     for i := 0 to 4 do
  12.     begin
  13.       i1 := i0 + nMatrix[i, 0];
  14.       j1 := j0 + nMatrix[i, 1];
  15.       if (i1 <= (n-1)) and (j1 <= (n-1)) and (i1 >= 0) and (j1 >= 0)  then
  16.       begin
  17.         tr[i] := particles[i1, j1].new;
  18.         if i > 0 then
  19.           trb[i-1] := true;
  20.       end else
  21.         trb[i] := false;
  22.     end;
  23.     result := to_v3f(0, 0, 0);
  24.     c := 0;
  25.     for i := 0 to 3 do
  26.     begin
  27.       j := i+1;
  28.       if j > 3 then
  29.         j := 0;
  30.       if trb[i] then
  31.       begin
  32.         result := v3f_add(result, v3f_crossproduct(v3f_sub(tr[i+1], tr[0]), v3f_sub(tr[j+1], tr[0])));  // Alle Normalen aufaddieren
  33.         inc(c);
  34.       end;
  35.     end;
  36.     if c > 0 then
  37.       result := v3f_normalize(v3f_scale(result, 1/c)) else  // und den Durchschnitt bilden
  38.         result := to_v3f(0, 0, 0);
  39.   end;


€: oh die zweite Seite habe ich noch garnet gesehen :lol:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 05, 2009 10:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
mir is grade aufgefallen, dass in der mitte des Zylinders das gar nich so schlimm aussieht
=> kann es sein dass OGL an den Kanten Probleme hat?

Screenshot?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 05, 2009 11:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn es so aussieht, wie ich es mir gerade vorstelle, dann würde ich vermuten, dass das komische Aussehen von dem großen Winkel zwischen Deckel und Seite vom Zylinder liegt. Die "glättung" der Normalen kann da zu einem unerwünscht starkem Effekt führen.
Hilfreich ist es, Kanten mit einem Winkel von > 30° (werf ich einfach mal so in den Raum, ist der Defaultwert von Blender in dieser sache) als "Kante" zu betrachten und die Normalen ungeglättet lassen.

greetings

_________________
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: So Jul 05, 2009 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
dass das komische Aussehen von dem großen Winkel zwischen Deckel und Seite vom Zylinder liegt. Die "glättung" der Normalen kann da zu einem unerwünscht starkem Effekt führen.

Wenn du dir den Code von Wh0p anschaust siehst du das er keinen Deckel hat und die Normalen auch nicht glättet o.ä. sondern direkt die für eine Zylinderwand korrekten Normalen berechnet. Eigentlich müsste das so richtig sein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 05, 2009 12:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Oh, ähh, ja... :oops:

Coolcat, da hast du natürlich recht. Den Codeteil hab ich übersehen.

greetings

_________________
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: So Jul 05, 2009 13:25 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also wenn ich deinen Code bei mir mal so einfüge, zeigen die Flächen nach innen, die Normalen aber nach außen. Oder liegt das an mir?

Eine Möglichkeit warum die Lichtintensität nicht ganz gleichmäßig ist, konnte die Interpolation sein. Ich weiß ja nicht wie das normale OpenGL Licht das macht aber wenn ich Shader verwende, normalisiere ich die Normalen immer im Pixelshader, weil die interpolierten Normalen danach nicht automatisch normalisiert werden.
Zumindest denke ich, das es so ist.

Also mal als Beispiel: Wenn dein Zylinder nur aus 4 Quads besteht, wären die Normalen orthogonal zueinander.
(1,0,0) und (0,1,0) ergibt in der Mitte der Fläche interpoliert (0.5,0.5,0). Dieser Vektor hat aber nicht die Länge 1, wodurch das Licht schwächer wird als es eigentlich sein sollte.

Das sollte sich aber verringern wenn man den Zylinder feiner unterteilt. Wenn das bei dir nichts ändert, dann liegt es entweder an was anderem oder ich irre mich in Bezug auf die Lichtberechnung.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 32 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]