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

Aktuelle Zeit: Fr Jul 18, 2025 11:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Flackern trotz double buffering
BeitragVerfasst: Fr Jun 17, 2005 19:38 
Offline
DGL Member

Registriert: Fr Jun 17, 2005 19:03
Beiträge: 1
Hallo,

Ich beschäftige mich jetzt seit etwa 2 Tagen mit OpenGl und bin auf ein für mich unüberwindbares Problem gestoßen. Als erstes Projekt habe ich Flug durch ein "Sternenfeld" programmiert. Das Sternenfeld liegt als dynamische Datenstruktur (doppelt verkettete Ringliste) mit diversen Eigenschaften (Farbe, Koordinaten, Geschwindigkeit, usw) vor. Die Darstellung erfolgt zwecks simuliertem MotionBlur über "GL_Lines". Im Grunde klappt alles auch, bis auf das Flackern der entfernten Sterne (siehe Binary) das ich absolut nicht bändigen kann...

Das zeichnen der Sterne erfolgt mit
Code:
  1. procedure glDraw(x:integer);
  2. var
  3.     help : stars;
  4. begin
  5.   glLoadIdentity();
  6.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  7.   glTranslate(0, 0,-7);
  8.   glRotatef(x/2, 0,0,1);
  9.  
  10.   help := star;         //star globale Variable vom dynamischen Datentyp
  11.  
  12.   glBegin(GL_Lines{GL_LINE_LOOP});
  13.     repeat
  14.       if star^.koord.z > 7 then
  15.       begin
  16.         delete(star);
  17.         add(star);
  18.       end
  19.       else
  20.       begin
  21.         glColor3f(star^.koord.z/5,star^.koord.z/6,star^.koord.z/7);
  22.         glVertex3f(star^.koord.x, star^.koord.y, star^.koord.z);
  23.         star^.koord.z := star^.koord.z + star^.speed;
  24.         glVertex3f(star^.koord.x, star^.koord.y, star^.koord.z);
  25.         star := star^.next;
  26.       end;
  27.     until help = star;
  28.   glend;
  29. end;


Aufgerufen in einer while-Schleife mit:

Code:
  1.       x := x +1;
  2.       glDraw(x);                           // Draw the scene
  3.       SwapBuffers(h_DC);                  // Display the scene


Wo liegt mein Fehler?

TIA

Navy


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 17, 2005 19:48 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich vermute mal, dass die Auflösung vom ZBuffer nicht groß genug ist. Ich vermute mal, dass du deine NEAR_Clipping-Plane auf 0 stehen hast. Stell die mal auf 1. Dann ist die Auflösung vom ZBuffer wesentlich größer und das schadet nie ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Zuletzt geändert von Frase am So Jun 19, 2005 19:55, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 18, 2005 13:30 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Na wenn die Sterne flackern ist doch alles so wie es sein muss! :D

Also ich sehe bei der Datei nur die gerade erscheinenden Sterne leicht Flimmern sonst nichts!

P.s.: Mir kommts vor wie bei diesen Drehdingern sprich -> Mir wird kotzübel von der Drehung( Normal vertrage ich viel aber das... )

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 18, 2005 14:52 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Hab mir das Programm jetzt doch mal angeschaut...

Das Erste, was mir aufgefallen ist, ist das starke Ruckeln. Wieso läuft das denn so langsam?

Dann natürlich das Flackern in der Mitte. Ich würde da spontan auf Texture Filtering tippen, aber ich nehme mal an, du benutzt keine Texturen. Wenn du wirklich alle Sterne mit GL_LINES renderst, dann erklärt das evtl. auch das Ruckeln.

Tipp am Rande: Render dein Sternenfeld mal so, wie es in 3D-Shootern gemacht wird. Du baust dir einen Würfel, auf dein kommt eine Sternentextur drauf und dir wird langsam nach unten gescrollt. Bei weit entfernten Sternen fällt das überhaupt nicht auf, besonders, wenn du noch mehr kleinere Würfel nimmst und die dann mittels Blending übereinander blendest. Dann hast du ein schönes Sternenfeld für weit entferne Sterne.

Das Flackern in der Mitte kann ich mir spontan nicht erklären, vermute aber folgendes:
Entweder erzeugst du neue Sterne direkt an der Far-Clipping Plane. Dann würde ich die Auflösung des Tiefenpuffers vergrößern und die entfernten Sterne mit Blending langsam sichtbar werden. Schaut schöner aus und flackert nicht ;)

Dann kannst du auch mal versuchen, die Linien mit GL_LINE_SMOOTH etwas an den Ecken zu glätten. Wieviel das bringt, und ob du es schon verwendest, kann ich nur vermuten.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 18, 2005 16:05 
Offline
DGL Member

Registriert: Do Apr 08, 2004 16:55
Beiträge: 516
Frase hat geschrieben:
Hab mir das Programm jetzt doch mal angeschaut...

Das Erste, was mir aufgefallen ist, ist das starke Ruckeln. Wieso läuft das denn so langsam?

Dann natürlich das Flackern in der Mitte. Ich würde da spontan auf Texture Filtering tippen, aber ich nehme mal an, du benutzt keine Texturen. Wenn du wirklich alle Sterne mit GL_LINES renderst, dann erklärt das evtl. auch das Ruckeln.

Tipp am Rande: Render dein Sternenfeld mal so, wie es in 3D-Shootern gemacht wird. Du baust dir einen Würfel, auf dein kommt eine Sternentextur drauf und dir wird langsam nach unten gescrollt. Bei weit entfernten Sternen fällt das überhaupt nicht auf, besonders, wenn du noch mehr kleinere Würfel nimmst und die dann mittels Blending übereinander blendest. Dann hast du ein schönes Sternenfeld für weit entferne Sterne.

Das Flackern in der Mitte kann ich mir spontan nicht erklären, vermute aber folgendes:
Entweder erzeugst du neue Sterne direkt an der Far-Clipping Plane. Dann würde ich die Auflösung des Tiefenpuffers vergrößern und die entfernten Sterne mit Blending langsam sichtbar werden. Schaut schöner aus und flackert nicht ;)

Dann kannst du auch mal versuchen, die Linien mit GL_LINE_SMOOTH etwas an den Ecken zu glätten. Wieviel das bringt, und ob du es schon verwendest, kann ich nur vermuten.


Das mit dem Ruckeln kann ich nicht bestätigen, ich habe ne Radeon 9600 Pro und es läuft flüssig und recht schnell!

_________________
Shareholder und Leitender Entwickler bei Pipedream-Games.

Zitat: Siehst du diesen Park da unten? Jeden Tag lernen sich darin Menschen kennen und verlassen einander. Und du hast dein ganzes Leben Zeit darin zu gehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 18, 2005 17:02 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich denke das Flackern ist ein Aliasing effekt. Da im Zentrum der Szene in großer entfernung man fast senkrecht auf die Linien guckt, ändert sich bei jedem Bild die sichtbarkeit der Linien. Wenn die Linien dann näher kommen, ist der Blickwinkel auf die Linien größer, so dass man immer einen Teil sieht. Dadurch verschwindet das flackern.

EINE IDEE:

Was du machen könntest ist, die Linien im Zentrum die weit entfernt sind als Punkte rendern und erst ab einer gewissen nähe als Linie darzustellen. Vielleicht noch etwas besser, statt einem Punkt 2 Punkte nehmen die verhältnismäßig dicht hintereinander fliegen. Da man eh von vorn draufguckt, sollte kein unterschied sichtbar sein. Wenn die Linien dann Näher dran sind, kannst du wieder auf GL_LINES umschalten.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 18, 2005 22:24 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich hab aber nur eine GeForce 5600 Ultra und bei mir ruckelt das deutlich. Außerdem sieht es am Anfang so aus, als ob weniger Sterne vorhanden wären und erst innerhalb der ersten halben Sekunde die Sterne vollständig angezeigt werden.

Lass das Ganze mal in Zeitlupe ablaufen, dann kannst du die Bewegung der einzelnen Sterne mitverfolgen und selber kontrollieren, wann und wo ein Stern verschwindet und wo er wieder auftaucht.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 18, 2005 23:56 
Offline
DGL Member

Registriert: Sa Apr 02, 2005 15:11
Beiträge: 41
Also bei mir ruckelt da nichts und flackern tut da auch nur sehr sehr wenig.
Sys@Radeon 9600


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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.007s | 15 Queries | GZIP : On ]