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

Aktuelle Zeit: Sa Jul 05, 2025 13:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Fehler beim Tiefentest, Z-Fighting
BeitragVerfasst: Do Aug 11, 2011 07:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Nov 18, 2005 18:28
Beiträge: 26
Hallo Leute,
ich hatte eine wirklich lange Pause im Bereich Programmierung, aber ich finde nun wieder etwas mehr Freizeit und wollte mich einem alten Projekt widmen.

Folgende Szene, 4 Quads rotieren um die Y-Achse, und schauen dabei immer die Z-Achse nach vorn respektive aus dem Monitor heraus. (Die Intention war eine rotierbarer Art BookletViewer für CDs).
Initialisierung usw. habe ich problemlos hinbekommen, die Szene OHNE Tiefentest schaut auch gut soweit aus, nur werden die Polygone dann eben nicht wie gewünscht gezeichnet, sondern scheinbar(?) ihrer Reihenfolge im Code nach gezeichnet.

Daher meine Annahme, schalte ich den Tiefentest explizit per glEnable() an, dann sollte es ja funktionieren. Leider entsteht dabei folgendes Chaos, auf das ich mir keinen Reim zu machen vermag.
(Hier ist die Z-Ausrichtung testweise mal auskommentiert)

Bild

Ich habe mal freihand in Photoshop mit blauem Farbton nachgezeichnet, wie die Geometrie eigentlich aussehen soll. Das ganze ist per Tasten drehbar, dabei "flackern" die Polygone extrem, mal sind sie zu sehen, mal nicht, mal verdecken sie sich, mal nicht.
Noch kurioser scheint mir die Darstellung des Grids, was aus 10x10 Linien besteht, von denen aber insgesamt nur 2 zu sehen sind. Der Rest wird schlicht weg nicht dargestellt bzw. ist er dank des mir unbekannten Fehlers nicht sichtbar.

Hier mal der Code für die Polygone:
Code:
  1. Var
  2.   i: Integer;
  3. Begin
  4.   glEnable(GL_TEXTURE_2D);
  5.   glColor4f(1.0, 1.0, 1.0, 1.0);
  6.   For i := 0 To 3 Do
  7.     Begin
  8.       glBindTexture(GL_TEXTURE_2D, bookletPrevTex[i]);
  9.       glLoadIdentity();
  10.       glRotatef(15, 1.0, 0.0, 0.0);
  11.       glTranslatef(0.0, -4.0, -18.0);
  12.       glRotatef(rotationAngle + i*90, 0.0, 1.0, 0.0);
  13.       glTranslatef(10.0, 0.0, 0.0);
  14.       //glRotatef(-rotationAngle - i*90, 0.0, 1.0, 0.0);  // Z-Ausrichtung
  15.       glBegin(GL_QUADS);
  16.         glTexCoord2f(0.0, 1.0); glVertex3f(-2.0, -2.0, 0.0);
  17.         glTexCoord2f(1.0, 1.0); glVertex3f(+2.0, -2.0, 0.0);
  18.         glTexCoord2f(1.0, 0.0); glVertex3f(+2.0, +2.0, 0.0);
  19.         glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, +2.0, 0.0);
  20.       glEnd();
  21.     End;


Änderungen an der Reihenfolge der Vertices brachten keine Änderungen, soweit habe ich eventuelle Lösungen im Forum bereits probiert. Vielleicht übersehe ich etwas eklatant wichtiges?
Ich bin für jeden Hinweis, der mich in die richtige Richtung stubst, dankbar! :)

Viele Grüße

_________________
Die Antwort ist 17, aber wie lautet die Frage?


Zuletzt geändert von Killian am Do Aug 11, 2011 14:51, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 11, 2011 08:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Kann es sein dass du deinen Tiefenpuffer nirgendwo leerst? Also glClear(...GL_DEPTH_BUFFER_BIT...)? Dann können dort nämlich zufällige Werte stehen die ein solches Chaos anrichten. Wenn du dies aber beriets tust kann es auch sein dass du evtl. ein Pixelformat ohne Tiefenpuffer angefordert oder bekommen hast.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 11, 2011 14:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Nov 18, 2005 18:28
Beiträge: 26
Hallo Sascha,
vielen Dank für die schnelle Antwort.

Ich rufe initial bei jedem Renderloop folgendes auf:
Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT);
  3. glViewPort(0, 0, gameForm.ClientWidth, gameForm.ClientHeight);  
  4.  


Die Initialisierung folgt streng den hiesigen Einsteiger-Tutorials:
Code:
  1.  
  2. InitOpenGL();
  3. DC := GetDC(hwnd_);
  4. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  5. ActivateRenderingContext(DC, RC);
  6. glClearColor(0.25, 0.25, 0.25, 1.0);
  7. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  8.  


Und die Projektion erfolgt so:
Code:
  1.  
  2. glMatrixMode(GL_PROJECTION);
  3. glLoadIdentity;
  4. gluPerspective(60, gameForm.ClientWidth/gameForm.ClientWidth, 0, 1000);
  5. glMatrixMode(GL_MODELVIEW);
  6. glLoadIdentity;
  7.  



Das besondere Schmankerl, wenn ich den Tiefentest per glDisable(GL_DEPTH_TEST) deaktiviere, erhalte ich zwar die richtige Geometriedarstellung (Quads, Grid, 2D-Hintergrund), aber die Tiefen-Sortierung ist natürlich unkorrekt.

Bild


Es handelt sich bestimmt wieder um einen Denkfehler oder es liegt am noch fehlenden Gesamtverständnis der Materie, aber irgendwie kann ich den Fehler nicht finden.
Danke, Danke für jede Hilfe! :)

_________________
Die Antwort ist 17, aber wie lautet die Frage?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 11, 2011 15:19 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Du darfst bei gluPerspective als NearClippingPlane nicht 0 nehmen, der Wert muss größer Null sein.

Zitat:
Die Genauigkeit des Tiefenpuffer wird von den in zNear und zFar angegebenen Werten beeinflusst. Je größer das Verhältnis von zFar zu zNear, je ineffektiver kann der Tiefenpuffer zwischen nah beieinander liegenden Oberflächen unterscheiden. Wenn r = zFar / zNear, dann gehen ungefähr log(2)r Bits an Tiefenpuffergenauigkeit verloren. Da r gegen Unendlich strebt wenn zNear gegen 0 strebt, darf zNear niemals gleich 0 gesetzt werden.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 11, 2011 15:43 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Nov 18, 2005 18:28
Beiträge: 26
Oha, dann habe ich mit meinem Verhältnis von 0:1000 natürlich utopischen Unsinn geschrieben.
Das hat das Problem gelöst.

Vielen Dank, auch für die Erklärung!

_________________
Die Antwort ist 17, aber wie lautet die Frage?


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


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