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

Aktuelle Zeit: Sa Jul 05, 2025 07:06

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



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 10, 2003 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
hmm. das ist zwar im endeffekt nix anderes als ein invalidate ins onpaint zu setzen, aber wenns anders nicht will... naja.

danke für eure hilfe :D

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 10, 2003 18:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ave!

Ich glaube den Fehler gefunden zu haben, du solltest Doublebuffering aktivieren...ersetz mal folgenden Code :

Code:
  1.  
  2.  
  3. dwflags := pfd_draw_to_window or pfd_support_opengl;
  4.  
  5.  


durch folgendes :

Code:
  1.  
  2.  
  3. dwflags := pfd_draw_to_window or pfd_support_opengl or pfd_doublebuffer;
  4.  
  5.  


oder mit Mike Lischkes Library :
Code:
  1.  
  2.  
  3. CreateRenderingContext(DC, [opDoubleBuffered],...)
  4.  
  5.  


Das wird wohl die Wurzel allen Übels gewesen sein, und der Grund dafür das Windows erst nach einem manuellen Neuzeichnen deine OGL-Szene gerendert hat!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 11, 2003 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
guten morgen.
das mit dem doublebuffer hab ich schon probiert und es bringt ebenso wenig.

die einzige möglichkeit ist es, entweder ins onpaint ein invalidate zu setzen oder ins onidle nen aufruf zu paint (das ist im endeffekt ja ein und das selbe.....)

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 11, 2003 13:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hmpff....wenn ich mir deinen Quellcode genauer angesehen hätte, hätte mir eigentlich ein schwerer Fehler auffallen müssen :

Dein Code :
Code:
  1.  
  2.  
  3. procedure TForm1.FormPaint(Sender: TObject);
  4.  
  5. var
  6.  
  7.   errorcode : tglenum;
  8.  
  9. begin
  10.  
  11.   glClearColor(0.0,0.4,0.0,0.0);
  12.  
  13.   glClear(gl_color_buffer_bit or gl_depth_buffer_bit);
  14.  
  15.   errorcode := glgeterror;
  16.  
  17.  &nbsp;if errorcode <> gl_no_error then
  18.  
  19.  &nbsp; &nbsp;raise exception.Create('error in paint' + #13 + gluerrorstring(errorcode));
  20.  
  21. end;
  22.  
  23.  


Dort fehlt am Ende noch der Befehl SwapBuffers(DC), der Windows dazu veranlasst die Puffer zu tauschen, also quisi den Backpuffer (in den du gezeichnet hast) nach vorne zu bringen (also sichtbar zu machen).
So sollte es also funzen :
Code:
  1.  
  2.  
  3. procedure TForm1.FormPaint(Sender: TObject);
  4.  
  5. var
  6.  
  7.  &nbsp;errorcode : tglenum;
  8.  
  9. begin
  10.  
  11.  &nbsp;glClearColor(0.0,0.4,0.0,0.0);
  12.  
  13.  &nbsp;glClear(gl_color_buffer_bit or gl_depth_buffer_bit);
  14.  
  15.  &nbsp;errorcode := glgeterror;
  16.  
  17.  &nbsp;if errorcode <> gl_no_error then
  18.  
  19.  &nbsp; &nbsp;raise exception.Create('error in paint' + #13 + gluerrorstring(errorcode));
  20.  
  21. SwapBuffers(DC)end;
  22.  
  23.  

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 13:14 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
daran liegt es ebenso wenig!
vielleicht liegt es ja auch an meinem pc. ich würde mal vorschlagen, du machst jetzt auch ne neue anwendung, ein panel drauf und dann den code verbinden. wenn du das problem nicht hast, liegt's an meinem pc:


Code:
  1.  
  2.  
  3. var
  4.  
  5.  &nbsp;dc : HDC;
  6.  
  7.  &nbsp;rc : HGLRC;
  8.  
  9.  
  10.  
  11. procedure TForm1.FormCreate(Sender: TObject);
  12.  
  13. var
  14.  
  15.  &nbsp;palette &nbsp; &nbsp; : hpalette;
  16.  
  17. begin
  18.  
  19.  &nbsp;dc := getdc(panel1.Handle);
  20.  
  21.  &nbsp;rc := createrenderingcontext(dc,[opDoubleBuffered,opGDI,opStereo],32,0,0,0,0,palette);
  22.  
  23.  &nbsp;wglmakecurrent(dc,rc);
  24.  
  25.  &nbsp;if not initopengl then
  26.  
  27.  &nbsp; &nbsp;raiselastoserror;
  28.  
  29.  &nbsp;formresize(application);
  30.  
  31. end;
  32.  
  33.  
  34.  
  35. procedure TForm1.FormPaint(Sender: TObject);
  36.  
  37. var
  38.  
  39.  &nbsp;errorcode : tglenum;
  40.  
  41. begin
  42.  
  43.  &nbsp;glClearColor(0.0,0.4,0.0,0.0);
  44.  
  45.  &nbsp;glClear(gl_color_buffer_bit or gl_depth_buffer_bit);
  46.  
  47.  &nbsp;errorcode := glgeterror;
  48.  
  49.  &nbsp;if errorcode <> gl_no_error then
  50.  
  51.  &nbsp; &nbsp;raise exception.Create('error in paint' + #13 + gluerrorstring(errorcode));
  52.  
  53.  &nbsp;SwapBuffers(dc);
  54.  
  55. end;
  56.  
  57.  
  58.  
  59. procedure TForm1.FormDestroy(Sender: TObject);
  60.  
  61. begin
  62.  
  63.  wglmakecurrent(dc,0);
  64.  
  65.  wgldeletecontext(rc);
  66.  
  67. end;
  68.  
  69.  
  70.  
  71. procedure TForm1.FormResize(Sender: TObject);
  72.  
  73. begin
  74.  
  75.  &nbsp;if (HandleAllocated) and (DC > 0) and (RC > 0) then
  76.  
  77.  &nbsp;begin
  78.  
  79.  &nbsp; &nbsp;glViewport(0, 0, Panel1.ClientWidth, Panel1.ClientHeight);
  80.  
  81.  &nbsp; &nbsp;glMatrixMode(GL_PROJECTION);
  82.  
  83.  &nbsp; &nbsp;glLoadIdentity;
  84.  
  85.  &nbsp; &nbsp;gluPerspective(45, Panel1.ClientWidth/Panel1.ClientHeight, 0.1, 1024);
  86.  
  87.  &nbsp;end;
  88.  
  89. end;
  90.  
  91.  

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ok...ich sag es jetzt zum letzten Male (das hab ich mindestens schon fünfmal gesagt) :
Seine OpenGL-Szene im OnPaint-Ereigniss zu zeichnen ist SCHLECHT...dazu schreibt man sich entweder nen eigenen Render-Loop oder nutzt das OnIdle-Event der Form!

Wenn ich den Renndercode nämlich aus OnPaint in den Idle-Event verlege, dann klappst einwandfrei...ausserdem solltes du die Parameter opGDI und opStereo bei der Rendercontexterstellung weglassen!

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
okay, ohne dir jetzt zu nahe teten zu wollen:
ich hab das bisher nirgends gelesen, vielleicht überlesen, aber sicher hast du es nicht fünfmal in diesem thread geschrieben!! daher kann man das acuh mehr oder weniger "normal" sagen, sprich deine "agressivität" kannst du gerne draußen lassen. ich hasse es, wenn jemand auf diese "herablassende" art mit einem spricht...

trotzdem danke für den tipp.

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
okay, ohne dir jetzt zu nahe teten zu wollen:
ich hab das bisher nirgends gelesen, vielleicht überlesen, aber sicher hast du es nicht fünfmal in diesem thread geschrieben!! daher kann man das acuh mehr oder weniger "normal" sagen, sprich deine "agressivität" kannst du gerne draußen lassen. ich hasse es, wenn jemand auf diese "herablassende" art mit einem spricht...

trotzdem danke für den tipp.


Wenn das ganze auf dich aggressiv wirkt, dann ein dickes Sorry :oops: ...war nicht so gemeint.
Auch hab ich nicht gesagt, das ich das schon fünf mal in diesem Thread erwähnt hab, aber ich habs hier im Forum schon mehrere male gesagt.
Das ganze hab ich auch nur deshalb FETT geschrieben, damit es vielleicht auch ein paar andere Neulinge hier lesen und den Fehler nicht machen.

Aber wie gesagt, wollte ich dich mit der Antwort nicht angreifen...

P.S.: Hats wenigstens gefunzt :?:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 12, 2003 14:36 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
achso. dann hab ich das wohl eben in den falschen hals gekriegt. fehler meinerseits.. :-)

ich hab jetzt ne applicationevents komponente eingebaut und in den onidle event auf meine procedure idlehandling (da ist das aus der paint drinne) verwiesen, danach ein done := true; funktioniert einwandfrei! kann opengl jetzt auch korrekt abschalten (n andres thema, aber das nur dadurch auch wirklich funktioniert!)

noch was: was ich richtig gut eben fand, dass du gleich darauf eingegangen bist, dass ich da wohl was in den falschen hals gekriegt hab. ich kenne es zur genüge aus anderen foren, dass da ein offener streit entsteht :-)

von daher: schönen sonntag noch :P

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 14, 2003 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Zitat:
Du darfst auf keinen Fall das Handle des Canvas einer Control an OpenGL übergeben


Versteh ich jetzt nicht ganz. Immerhin erwartet SetPixelFormat, wglCreateContext und wglMakeCurrent einen DC als Parameter. Wenn man nun nachschaut, stellt man fest, dass Form.Canvas.Handle oder Panel.Canvas.Handle als DC deklariert ist. Also warum diesen nicht verwenden?

P.S.: Weiß, etwas spät die Frage, aber ist mir halt momentan irgendwie ein Rätsel ;)

_________________
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: Mi Jan 15, 2003 12:15 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Hab's herrausbekommen, warum nicht. Funktioniert einfach nicht. Allerdings stellt sich hier auch wieder die Frage, warum nicht...

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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