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!
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.....)
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:
procedure TForm1.FormPaint(Sender: TObject);
var
errorcode : tglenum;
begin
glClearColor(0.0,0.4,0.0,0.0);
glClear(gl_color_buffer_bit or gl_depth_buffer_bit);
errorcode := glgeterror;
if errorcode <> gl_no_error then
raise exception.Create('error in paint' + #13 + gluerrorstring(errorcode));
end;
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:
procedure TForm1.FormPaint(Sender: TObject);
var
errorcode : tglenum;
begin
glClearColor(0.0,0.4,0.0,0.0);
glClear(gl_color_buffer_bit or gl_depth_buffer_bit);
errorcode := glgeterror;
if errorcode <> gl_no_error then
raise exception.Create('error in paint' + #13 + gluerrorstring(errorcode));
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:
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!
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...
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 ...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...
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
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?
Mitglieder in diesem Forum: 0 Mitglieder und 10 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.