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

Aktuelle Zeit: Fr Jul 18, 2025 11:16

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Alpha bei Cubes
BeitragVerfasst: Mi Feb 18, 2009 21:28 
Offline
DGL Member

Registriert: Mo Feb 13, 2006 15:47
Beiträge: 8
Hi,

ich habe ein kleines Problem bei der Darstellung von transparenten Cubes.
Diser "Fehler" tritt bei einer best. Ansicht der rot. Würfel auf (siehe Anhang).

Die Würfel werden wiefolgt dargestellt:


Code:
  1. procedure MyRenderProc; stdcall;
  2. var
  3.   x,y,z: integer;
  4.  
  5. begin
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.   glLoadIdentity;
  8.  
  9.   gluLookAt(0, 0, 100,  0, 0, 0,  0, 1, 0);
  10.   glRotatef(GetTickCount / 50, 1,-1,1);
  11.  
  12.   for z := 0 to 7 do
  13.     for x := 0 to 7 do
  14.       for y := 0 to 7 do
  15.       begin
  16.         glPushMatrix;
  17.         glTranslatef((x-3.5)*5, (z-3.5)*5, (y-3.5)*5);
  18.         glColor4f(0.25, 0.25, 0.25, 0.5);
  19.  
  20.         glCallList(gllQuader);
  21.  
  22.         glPopMatrix;
  23.       end;
  24.  
  25.   glFlush;
  26. end;


Die Initialis. von OpenGL so:

Code:
  1. procedure TOpenGL.SetupOpenGl;
  2. begin
  3.   glClearColor(0.0, 0.0, 0.0, 0.0); // Bildschirm löschen (schwarz)
  4.  
  5.   glClearDepth(1.0); // Depth Buffer Setup
  6.   //glEnable(GL_TEXTURE_2D); // Aktiviert Texture Mapping
  7.   glShadeModel(GL_SMOOTH); // Aktiviert weiches Shading
  8.   glDepthFunc(GL_LESS); // Bestimmt den Typ des Depth Testing
  9.   glEnable(GL_DEPTH_TEST); // Aktiviert Depth Testing
  10.  
  11.   glEnable(GL_ALPHA_TEST); // Texturen/objecte auf Alphabl. testen
  12.   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  13.  
  14.   glEnable(GL_BLEND); // Alphablend aktivieren
  15.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Qualitativ bessere Koordinaten Interpolation
  16.  
  17.   glEnable(GL_CULL_FACE);  // nicht sichtbare Flächen nicht rendern (Backface)
  18.  
  19.  // glEnable(GL_NORMALIZE);    // normalen beachten
  20.  
  21.   glEnable(GL_COLOR_MATERIAL); // Materialien erlauben
  22.  
  23.   LPos := V4f(0, 50, 100, 1); // Lichtpos. setzen
  24.   glLightfv(GL_LIGHT0, GL_POSITION, @LPos);
  25.  
  26.   gllQuader := glGenLists(1);
  27.   glNewList(gllQuader, GL_COMPILE);
  28.   glQader;
  29.   glEndList;
  30.  
  31.   glEnable(GL_LIGHT0);  // Lampe 1 an
  32.   glEnable(GL_LIGHTING); // es werde licht überall
  33. end;


Der einzelne Würfel wird mit Normalen erstellt:

Code:
  1. procedure glQader;
  2. begin
  3.   glBegin(GL_QUADS);
  4.     // Front Face
  5.     glNormal3f( 0.0, 0.0, 1.0);
  6.     glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
  7.     glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
  8.     glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
  9.     glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
  10.  
  11.  
  12.    //  ...  //
  13.  
  14.  
  15.     // Back Face
  16.     glNormal3f( 0.0, 0.0,-1.0);
  17.     glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
  18.     glTexCoord2f(1.0, 0.0); glVertex3f(-1.0,  1.0, -1.0);
  19.     glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
  20.     glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0);
  21. end;


Woran kann das liegen ?


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 01:14 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Stimmt doch alles. Wenn du den Würfel betrachtest, sind bei einer bestimmten Drehung die Würfel durchsichtig.

Du musst beachten, dass die Würfel im Hintergrund schon gezeichnet sind bevor die davor gezeichnet werden.
Transparenz bedeutet nur, dass beim Zeitpunkt der Erstellung die Farbe mit dem aktuellen Hintergrund verrechnet wird.
Wenn du also erst die vorderen Würfel zeichnest, ist der Hintergrund Schwarz. Die danach gezeichneten Würfel werden für die Transparenz ignoriert.

Steht übrigens auch im Tutorial.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 15:18
Beiträge: 62
Blending und der Tiefentest wollen nicht so richtig zusammenarbeiten. Schalte also den Tiefentest aus - allerdings musst du jetzt die Reihenfolge, in der die Quader gerendert werden, selber bestimmen. Da kenne ich mich nicht so aus, du könntest es aber mit der 3D-Variante des Satzes des Pythagoras versuchen. :)

Grüße,
Yogu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 18:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Alternativ (eine Methode, die ich gerne benutze) lässt du den Tiefentest an, das Blending auch, aber machst das Backfaceculling aus. Dann stellst du sicher, dass dein würfel von allen seiten richtig funktioniert.
Wenn du dann noch die Backfaces wieder haben willst, musst du nur deinen Zeichencode duplizieren und die Reihenfolge der Quads und der Vertices innerhalb der Quads umdrehen. Danach solltest du einen Würfel haben, wie du ihn willst.

Ist leider nicht bei jedem Mesh so einfach zu machen, aber hier tuts seinen dienst.

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: Do Feb 19, 2009 21:01 
Offline
DGL Member

Registriert: Mo Feb 13, 2006 15:47
Beiträge: 8
Also durch das abschalten des Backfaceculling ist eine leichte Verbesserung aufgetreten.
Leider Ist der Rest aber noch nicht so doll. Auch das hinzufügen eines "Hintergrundlichtes" brachte nix.
Das zeichnen der einzelnen Würfel von hinten nach vorn ist mir zu aufwendig.
Den Vorschlag von Lord Horazont muss ich noch ausprobieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 19, 2009 21:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Um das sortieren beim Zeichnen von mehreren Transparenten Objekten kommst du nicht drumrum. Punkt. Ob dus mit oder ohne Tiefentest machst, ist dabei egal. Wenn dus ohne machst, musst du auch sortieren, sonst sieht das reichlich komisch aus, und mit auch. Die einzige (!) ausnahme ist Additives Blending (also glBlend(GL_ONE, GL_ONE); ). Da kannst du alle Objekte mit diesem Transparenzmodus zum schluss zeichnen, mit glDepthMask(False);.

Um anständig zu sortieren, würde ich die Objekte irgendwie Kapseln, sodass ich die Bounding Boxes habe und nach denen dann sortieren kann. Das geht entweder mit Satz des Pythagoras für 3d (Wurzel aus (x^2 + y^2 + z^2)) oder indem du dir die Modelview-Matrix rausziehst (glGetFloatv) und die auf die Koordinaten anwendest. Dann hast du in dem Z-Feld des Vektors entsprechend die Tiefe, nach der OpenGL auch prüft. Ich würde hier die zweite methode favorisieren. Und dann halt einfach sortieren und in der reihenfolge zeichnen. Das sortieren musst du auch nicht jeden Frame sondern immer nur, wenn sich position oder drehung der Kamera verändern.

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: Do Feb 19, 2009 23:22 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@tP: Wenn deine Objekte komplizierter werden, musst du sogar noch weiter gehen, und die Einzelteile deines Objekts nach Tiefe sortieren. Glücklicherweise ist das nicht ganz vergeben, denn es gibt z.B. Sachen wie
Zitat:
LOD
die auch Tiefenabhängig sind, und wo du die Tiefeninfos wiederverwenden kannst.

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


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


Wer ist online?

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