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

Aktuelle Zeit: Do Jul 10, 2025 20:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Flimmern bei Farbenwechsel
BeitragVerfasst: Mi Sep 05, 2007 22:38 
Offline
DGL Member

Registriert: Do Nov 23, 2006 20:44
Beiträge: 21
Wohnort: Wien
Hallo,

Ich habe vor 6 Monaten mal mit den Grundgerüßt von OpenGL angefangen und habe heute plötzlich Lust bekommen mal ein wenig weiter herum zu probieren.

Ich will einen Kreis machen, dessen Radius pro Zeiteinheit immer kleiner wird und die Farbe wechselt,
nach etlichen Überlegungen (jaja da gibts doch so ein Koordinatensystem dafür :-) ) habe ich das endlich hinbekommen.


Die Zeichenroutine

Code:
  1. glBegin(GL_POLYGON);
  2.  
  3.     winkel:=0;
  4.     radius:=radius-0.1;
  5.     glColor3f(random(2),random(2),random(2));
  6.  
  7.     for i:=1 to 70 do
  8.     begin
  9.       winkel:=winkel+0.1;
  10.       x:=Radius*(cos(winkel));
  11.       y:=Radius*(sin(winkel));
  12.  
  13.       glVertex3f(x,y,0);
  14.     end;
  15.   glEnd;


Das Problem ist, das wenn der Kreis etwas größer ist, beim Farbenwechseln immer ein Flimmern auftaucht.

Warum tritt das auf, wie kann man das Problem beseitigen?

Der Timer ist auf 200 Milisekunden eingestellt.


Hier der ganze Code:

Code:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, DGLOpenGL, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Timer1: TTimer;
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure FormResize(Sender: TObject);
  14.     procedure FormDestroy(Sender: TObject);
  15.     procedure draw;
  16.     procedure Timer1Timer(Sender: TObject);
  17.   end;
  18.  
  19. var
  20.   Form1: TForm1;
  21.   DC : HDC;
  22.   RC : HGLRC;
  23.  
  24.   radius: extended=5;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TForm1.FormCreate(Sender: TObject);
  31. begin
  32.   Randomize;
  33.  
  34.   DC:= GetDC(Handle);
  35.   if not InitOpenGL then Application.Terminate;
  36.   RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0);
  37.   ActivateRenderingContext(DC, RC);
  38.  
  39.   glClearColor(0.3, 0.4, 0.7, 0.0);
  40.   glEnable(GL_DEPTH_TEST);
  41.   glEnable(GL_CULL_FACE);
  42. end;
  43.  
  44. procedure Tform1.draw;
  45. var
  46.   i: integer;
  47.   x,y,winkel: extended;
  48.  
  49. begin
  50.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  51.  
  52.   glMatrixMode(GL_PROJECTION);
  53.   glLoadIdentity;
  54.   gluPerspective(45.0, ClientWidth/ClientHeight, 1, 1000);
  55.  
  56.   glMatrixMode(GL_MODELVIEW);
  57.   glLoadIdentity;
  58.  
  59.   glTranslatef(0, 0, -10);
  60.  
  61.    glBegin(GL_POLYGON);
  62.  
  63.     winkel:=0;
  64.     radius:=radius-0.1;
  65.     glColor3f(random(2),random(2),random(2));
  66.  
  67.     for i:=1 to 70 do
  68.     begin
  69.       winkel:=winkel+0.1;
  70.       x:=Radius*(cos(winkel));
  71.       y:=Radius*(sin(winkel));
  72.  
  73.       glVertex3f(x,y,0);
  74.     end;
  75.   glEnd;
  76.  
  77.   SwapBuffers(DC);
  78. end;
  79.  
  80.  
  81. procedure TForm1.FormResize(Sender: TObject);
  82. begin
  83.   glViewport(0, 0, ClientWidth, ClientHeight);
  84.   glMatrixMode(GL_PROJECTION);
  85.   glLoadIdentity;
  86.   gluPerspective(45.0, ClientWidth/ClientHeight, 1, 1000);    
  87.  
  88.   glMatrixMode(GL_MODELVIEW);
  89.   glLoadIdentity;
  90. end;
  91.  
  92. procedure TForm1.FormDestroy(Sender: TObject);
  93. begin
  94.   DeactivateRenderingContext;
  95.   DestroyRenderingContext(RC);
  96.   ReleaseDC(Handle, DC);
  97. end;
  98.  
  99. procedure TForm1.Timer1Timer(Sender: TObject);
  100. begin
  101.   draw;
  102. end;
  103.  
  104. end.


Danke

// edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Sep 05, 2007 23:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Ich kann mir beim Anschauen grade nichts Flimmerndes vorstellen, aber vielleicht liegt das an deaktiviertem V-Sync. Im Normalfall kannst du das beim Initialisieren mit
Code:
  1. wglSwapIntervalEXT(1);
anschalten, wenn es nicht generell in den Grafikkarteneinstellungen deaktiviert wurde.

PS: Verwende doch das nächste Mal [pascal] statt [code] Tags ;)

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 07:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich tippe eher mal darauf, das Gefühl entsteht es flimmere entsteht, weil sich die Farben ständig wechseln. Was ja eigentlich auch richtig ist, denn Flimmern ist ein für das Auge sichtbarer Wechsel des Inhalt und das passiert dort ja in jedem Frame.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 06, 2007 08:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Warum schreibst du random(2)? Das gibt dir den Wert 0 ODER 1 für jeweils r, g, b.
Vielleicht ist es ja auch gewünscht, aber wenn du "richtige" Zufallsfarben haben willst, musst du einfach nur random() schreiben. Das liefert einen Gleitkommawert zwischen 0 UND 1. Mit deiner Methode sind nämlich nur 2³=8 Farben möglich.

Gruß, MatReno

_________________
http://texelviews.delphigl.com


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


Wer ist online?

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