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

Aktuelle Zeit: Fr Jul 18, 2025 22:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit pfd_doublebuffer
BeitragVerfasst: So Dez 15, 2002 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
warum funktioniert pfd_doublebuffer manchmal und manchmal nicht.
wenn ich beispielsweise nen Rechteck hin und herschiebe, will ich das Flackern mit pfd_doublebuffer verhindern.
Oft ist es aber so, dass kein OpenGL fenster angezeigt wird, sondern die Form grau bleibt! Mach ich das wieder weg, geht es aber es flackert.

Ein anderes Mal mach ich was ähnliches und doublebuffer funktioniert.
Kann mir jemand sagen warum?

Mfg

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Dez 15, 2002 20:57 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Ich vermute das Problem weniger beim Flackern, sondern vielmehr generell bei der Zeichenroutine. Hast Du mal deinen Source-Code genau mit unserem Templates verglichen? Besteht das Problem da auch? Kannst Du auf diesen aufbauen und das Problem rekonstruieren? Oder tritt das problem dort auch auf, wenn nein, was ist anderes zu deinen Source? Meist sind es Kleinigkeiten, die einen wirklich Probleme bereiten ;)

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 16, 2002 12:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Das Problem mit der Grauen Form hatte ich auch mal. Lag daran, dass ich z.B. keinen Z-Buffer haben wollte (cDepthBits = 0). Damit kam OpenGL in Verbindung mit PFD_DOUBLEBUFFER nicht klar und hat sich nicht korrekt initilalisiert. Stell also sicher, dass Z-Buffer und Double-Buffer mit angegeben wird.

Die geläufigsten Werte für cDepzhBits, welche für funktionieren müssten, sind 8, 16, 24. Manche Treiber lassen auch per Hardware 32 zu, aber da sich Z und Stencil-Buffer teilen, werden die meisten so optimiert das für Z-und Stencil zusammen immer 16 bzw. 32 Bit zur Verfügung stehen. Also kann es gut sein (z.B. bei NVidia), dass 24-Bit Z-Buffer das höchste ist, da der Treiber noch 8 Bit für den Stencil-Buffer reserviert. (Auch wenn man ihn NICHT brauch). Außerdem hängt Z und Stencil-Buffer Bit-Tiefe mit der Bit-Tiefe des Color-Buffers zusammen. Diese sind immer gleich, so dass bei einer Farbtiefe von 16 Bit kein Stencil per Hardware zur verfügung steht (da meistens 16-Bit für Z-Buffer verwendet wird) und somit der Stencil per Software emuliert wird und extrem langsam ist. Also im 16-Bit Modus einfach auf Stencil verzeichten, da es sein kann, das 8-Bit Z und 8-Bit Stencil nicht unterstützt werden.

Diese Aussagen beziehen sich auf "Messwerte" und Erfahrungen mit NVidia GeForce 2 & GeForce 4 Karten. Bei anderen Chipsätzen (Bsp. ATI) kann das durch aus anders sein. Sollte OpenGL zwar per Initialisierug behaupten, dass alles OK ist, aber dennoch fehlerhaft sein (Graues Fenster), dann kann das durchaus an den oben beschriebenen Konstellationen liegen.

Tipp: 16-Bit Farbtiefe, 16-Bit ZBuffer 0-Bit Stencil, oder 32-Bit Farbtiefe, 16/24-Bit Z-Buffer, 0/8-Bit Stencil. Rendern mit 32-Bit ist sowieso besser, da dann (auch wieder bei NVidia festgestellt) alle Funktionen und Erweiterungen von OpenGL zur Verfügung stehen (z.B. Cube-Enviroment-Mapping) die in 16-Bit einfach abgeschaltet werden und somit NICHT zur Verfügung stehen! Sehr verwirrend beim ersten mal. Wer's nicht glaubt, schaut sich mal die Extension-Liste im 16-Bit Modus und im 32-Bit Modus an. Dann seht ihr's ja selber.

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 16, 2002 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
Code:
  1.  
  2.  
  3. procedure InitGL(Handle: HDC);
  4.  
  5. var pfd: TPixelFormatDescriptor; PixelFormat: Integer;
  6.  
  7. begin
  8.  
  9. FillChar(pfd, SizeOf(pfd), 0);
  10.  
  11. with pfd do
  12.  
  13. begin
  14.  
  15. nSize := sizeof(pfd);
  16.  
  17. nVersion := 1;
  18.  
  19. dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  20.  
  21. iPixelType:= PFD_TYPE_RGBA;
  22.  
  23. cColorBits:= 16;
  24.  
  25. cDepthBits:= 16;
  26.  
  27. iLayerType:= PFD_MAIN_PLANE;
  28.  
  29. end;
  30.  
  31. PixelFormat := ChoosePixelFormat(Handle, @pfd);
  32.  
  33. SetPixelFormat(Handle, PixelFormat, @pfd);
  34.  
  35. end;
  36.  
  37.  
  38.  
  39. procedure TForm1.FormCreate(Sender: TObject);
  40.  
  41. begin
  42.  
  43. InitGL(Canvas.Handle);
  44.  
  45. hrc := wglCreateContext(Canvas.Handle);
  46.  
  47. end;
  48.  
  49.  
  50.  
  51. procedure TForm1.FormDestroy(Sender: TObject);
  52.  
  53. begin
  54.  
  55. wglDeleteContext(hrc);
  56.  
  57. wglMakeCurrent(0, 0);
  58.  
  59. end;
  60.  
  61.  
  62.  
  63. procedure TForm1.zeichnen;
  64.  
  65. begin
  66.  
  67. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  68.  
  69. glBegin(GL_TRIANGLES);
  70.  
  71. glColor3f(1,0,0);
  72.  
  73. glVertex2f(-0.5,-0.5);
  74.  
  75. glColor3f(0,1.0,0);
  76.  
  77. glVertex2f(0.5,-0.5);
  78.  
  79. glColor3f(0,0,1.0);
  80.  
  81. glVertex2f(0.0,0.5);
  82.  
  83. glEnd;
  84.  
  85. glFlush();
  86.  
  87. end;
  88.  
  89.  
  90.  
  91. procedure TForm1.FormPaint(Sender: TObject);
  92.  
  93. begin
  94.  
  95. wglMakeCurrent(Canvas.Handle, hrc);
  96.  
  97. Zeichnen;
  98.  
  99. end;
  100.  
  101.  


Hier ist z.B. ein kleines Program bei dem Doublebuffer nicht funktioniert.
Okay es ist ja auch nicht notwendig, aber es müsste doch normalerweise gehen. Ich hab mal verschiedene Werte bei cColorBits und cDepthBits ausprobiert aber nichts funktioniert.
Mach ich vielleicht was bei der Initialisierung falsch?

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 16, 2002 18:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich habs schonmal vor Kurzem in nem anderen Thread gesagt :
Das OnPaint-Ereignis einer Form zum Zeichnen der OpenGL-Szene zu nutzen ist schlecht!

Dieses Ereignis wird z.B. nur dann aufgerufen, wenn deine Form die Größe ändert oder wieder in den Vordergrund kommt.
Damit du deine OpenGL-Szene zeichnen kannst, benötigst du aber ein sich zyklisch wiederholendes Ereignis.
Das kann entweder in einer selbstgestarteten Schleife passieren, oder aber im OnIdle-Event.

Edit :
Ausserdem solltest du am Ende deiner Zeichenroutine die Puffer (Vorne/Hinten->Deshalb Doublebuffering) tauschen.Dies geschieht mit SwapBuffers(DeviceContext).Ein einfaches glFlush() reicht hier nicht aus.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 16, 2002 20:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 14, 2002 14:00
Beiträge: 14
Wohnort: Saarland
Zitat:
Edit :
Ausserdem solltest du am Ende deiner Zeichenroutine die Puffer (Vorne/Hinten->Deshalb Doublebuffering) tauschen.Dies geschieht mit SwapBuffers(DeviceContext).Ein einfaches glFlush() reicht hier nicht aus.


Genau das war es was ich gesucht habe. Jetzt funktioniert das mit Pfd_doublebuffer. :D

MfG

Jack Falworth

_________________
Warum soll ich über eine Mauer klettern wenn ich auch durch das Tor reingehen kann?


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.008s | 16 Queries | GZIP : On ]