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

Aktuelle Zeit: Sa Jul 05, 2025 11:02

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



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mi Jan 08, 2003 22:31 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
hallo :-)
ich schreib gerade ein etwas komplexeres programm, bei dem ich unter anderem in eine pagecontrol einsetze. auf einer "page" soll nun ein 3d window für opengl sein. ich hab jetzt irgendwo gelesen, dass es jemandem gelungen ist, den opengl-context auf ein panel zu projizieren. hab ich ausprobiert, aber bei der überprüfung if errorcode <> GL_NO_ERROR kommt dann ein fehler. warum? ich hab das auch bei ner paintbox probiert. selber fehler. die fehlermeldung ist invalid operation..

hier mal der source (der nicht zu groß ist):


Code:
  1.  
  2.  
  3. var
  4.  
  5.  &nbsp;glcontext : hglrc;
  6.  
  7.  
  8.  
  9.  
  10.  
  11. procedure TForm1.FormCreate(Sender: TObject);
  12.  
  13. var
  14.  
  15.  &nbsp;pfd: tpixelformatdescriptor;
  16.  
  17.  &nbsp;formatindex: integer;
  18.  
  19. begin
  20.  
  21.  &nbsp;fillchar(pfd,sizeof(pfd),0);
  22.  
  23.  &nbsp;with pfd do
  24.  
  25.  &nbsp;begin
  26.  
  27.  &nbsp; &nbsp;nsize := sizeof(pfd);
  28.  
  29.  &nbsp; &nbsp;nversion := 1;
  30.  
  31.  &nbsp; &nbsp;dwflags := pfd_draw_to_window or pfd_support_opengl;
  32.  
  33.  &nbsp; &nbsp;ipixeltype := pfd_type_rgba;
  34.  
  35.  &nbsp; &nbsp;ccolorbits := 24;
  36.  
  37.  &nbsp; &nbsp;cdepthbits := 32;
  38.  
  39.  &nbsp; &nbsp;ilayertype := pfd_main_plane;
  40.  
  41.  &nbsp;end;
  42.  
  43.  &nbsp;formatindex := choosepixelformat(paintbox1.Canvas.Handle,@pfd);
  44.  
  45.  &nbsp;setpixelformat(canvas.Handle,formatindex,@pfd);
  46.  
  47.  &nbsp;glcontext := wglcreatecontext(paintbox1.Canvas.Handle);
  48.  
  49.  &nbsp;wglmakecurrent(paintbox1.canvas.Handle,glcontext);
  50.  
  51. end;
  52.  
  53.  
  54.  
  55. procedure TForm1.FormDestroy(Sender: TObject);
  56.  
  57. begin
  58.  
  59.  &nbsp;wglmakecurrent(paintbox1.canvas.Handle,0);
  60.  
  61.  &nbsp;wgldeletecontext(glcontext);
  62.  
  63. end;
  64.  
  65.  
  66.  
  67. procedure TForm1.FormPaint(Sender: TObject);
  68.  
  69. var
  70.  
  71.  &nbsp;errorcode : glenum;
  72.  
  73. begin
  74.  
  75.  &nbsp;glclearcolor(0.0,0.4,0.0,0.0);
  76.  
  77.  &nbsp;glclear(gl_color_buffer_bit);
  78.  
  79.  &nbsp;errorcode := glgeterror;
  80.  
  81.  &nbsp;if errorcode<>gl_no_error then
  82.  
  83.  &nbsp; &nbsp;raise exception.Create('error' + &nbsp;#13 + gluerrorstring(errorcode));
  84.  
  85. end;
  86.  
  87.  

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 05:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Edit : Sorry, hab aus Versehen den falschen Codeschnippsel genommen und verbessert...hab ihn grad durch den richtigen ersetzt!

Hm...du bist innerhalb kurzer Zeit der Dritte, der den selben Fehler macht.Ändere mal deinen Code :

Code:
  1.  
  2.  
  3. formatindex := choosepixelformat(paintbox1.Canvas.Handle,@pfd);
  4.  
  5. setpixelformat(canvas.Handle,formatindex,@pfd);
  6.  
  7. glcontext := wglcreatecontext(paintbox1.Canvas.Handle);
  8.  
  9. glmakecurrent(paintbox1.canvas.Handle,glcontext);


nach

Code:
  1.  
  2.  
  3. formatindex := choosepixelformat(Panel1.Handle,@pfd);
  4.  
  5. setpixelformat(Panel1.Handle,formatindex,@pfd);
  6.  
  7. glcontext := wglcreatecontext(Panel1.Handle);
  8.  
  9. wglmakecurrent(Panel1.Handle,glcontext);
  10.  
  11.  


Du darfst auf keinen Fall das Handle des Canvas einer Control an OpenGL übergeben, sondern nur das normale Handle der Control selbst!
Und wenn obiges nicht funzt, dann hol dir mittels DC := GetDC(Panel1.Handle) einen gütligen DeviceContext.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 20:02 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
ich hab jetzt obiges mal auf ein panel angewendet:
startet man das programm normal, erscheint das panel.
resize ich jetzt, zeigt sich statt des panels opengl.
wie umgehe ich das?
wenn ich in formcreate ein panel.invalidate setze bringt es nichts. ebensowenig im formpaint.

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 20:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Bevor OpenGL auf deinem Panel rendert, musst du "ihm" erstmal nen Viewport geben...am besten machst du das im OnResize-Event deiner Form, da dieser zum Einen beim Programmstart und zum anderen beim Ändern der Fenstergröße erfolgt :

Code:
  1.  
  2.  
  3. procedure TForm1.FormResize(Sender: TObject);
  4.  
  5. begin
  6.  
  7. if (HandleAllocated) and (DC > 0) and (RC > 0) then
  8.  
  9.  &nbsp;begin
  10.  
  11.  &nbsp;glViewport(0, 0, Panel1.ClientWidth, Panel1.ClientHeight);
  12.  
  13.  &nbsp;glMatrixMode(GL_PROJECTION);
  14.  
  15.  &nbsp;glLoadIdentity;
  16.  
  17.  &nbsp;gluPerspective(45, Panel1.ClientWidth/Panel1.ClientHeight, 0.1, 1024);
  18.  
  19.  &nbsp;end;
  20.  
  21. end;
  22.  
  23.  

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 20:31 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
ah, ok, vielen dank!

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:06 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
okay, mitlerweile bin ich daheim und habs natürlich sofort ausprobiert.

es ist immer noch so, dass opengl erst gezeichnet wird, wenn ich es per hand (oder im quellcode form.width:=form.width+1;) verändert hab.


???

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:13 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
okay, bin etwas weiter gekommen: wenn ich einen butten drauf lege und

Code:
  1.  
  2.  
  3. procedure form1.button1click(sender:tobject);
  4.  
  5. begin
  6.  
  7.  &nbsp;form1.invalidate;
  8.  
  9. end;
  10.  
  11.  



damit verbinde, wird opengl richtig auf dem panel gezeichnet. hrmpf. ich möchte aber zunächst, dass es das automatisch beim start tut und nicht erst beim buttonclicken..

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Hmpff...Normalerweise sollte das mit dem OnSize-Event ohne Probs klappen...
Aber ruf den OnSize-Event mit self als Parameter oder Invalidate doch einfach in deinem OnCreate-Ereignis auf.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:40 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
bringt beides nichts! auch gleichzeitig nichts.

wenn ich invalidate ins onpaint lege, dann hab ich wahnsinnige performanceprobleme (is ja wohl logisch...) -> ist quasi dann eine endlosschleife :-) :

form malt -> invalidate -> form malt -> invalidate -> form malt -> invalidate -> ...

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:46 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Okt 26, 2002 17:14
Beiträge: 188
Wohnort: Hannover/Lüneburg
Hallo!

Kannst Du nciht einfach den Code aus dem OnResize in ne eigene prozedur packen und diese dann im OnCreate und im OnResize aufrufen?

_________________
Thunderman
Bei schwierigen Problemen entscheiden wir uns einfach für die richtige Lösung. Klar?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Zitat:
bringt beides nichts! auch gleichzeitig nichts.  

wenn ich invalidate ins onpaint lege, dann hab ich wahnsinnige performanceprobleme (is ja wohl logisch...) -> ist quasi dann eine endlosschleife :-) :


Du sollst das OnResize-Event ja auch im OnCreate-Event deiner Form aufrufen...wenns dann immernoch net geht, dann ist an deiner Rendercontext-Initialisierung etwas mächtig falsch gelaufen...an deiner Stelle würde ich mir mal die OpenGL12.pas von Mike Lischke herunterladen.
Dort gibts die Funktion CreateRenderingContext, mit der man ganz bequem nen Context erstellen kann, und der man einfach nur Parameter wie Farbtiefe, Z-Puffertiefe, usw. übergibt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:51 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
das funktioniert leider eben so wenig...

ich bin jetzt weg. also antworten und weitere tests erst morgen wieder, weil ich morgen ne klausur schreib und nicht allzu müde sein sollte....

_________________
http://www.rochus.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 09, 2003 22:56 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
die hab ich schon, auch die gl,glu,glut von delphi3d.net

mal schaun. aber heute nicht mehr!

bis morgen dann :-)

_________________
http://www.rochus.net


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

Registriert: So Dez 29, 2002 10:37
Beiträge: 251
Wohnort: Ulm
sodele, hab jetzt das mit dem createrenderingcontext über opengl12.pas von lischke gemacht, exakt selber fehler, alle tips befolgt. hier der sourccode:

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,[],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. end;
  54.  
  55.  
  56.  
  57. procedure TForm1.FormDestroy(Sender: TObject);
  58.  
  59. begin
  60.  
  61.  wglmakecurrent(dc,0);
  62.  
  63.  wgldeletecontext(rc);
  64.  
  65. end;
  66.  
  67.  
  68.  
  69. procedure TForm1.FormResize(Sender: TObject);
  70.  
  71. begin
  72.  
  73.  &nbsp;if (HandleAllocated) and (DC > 0) and (RC > 0) then
  74.  
  75.  &nbsp;begin
  76.  
  77.  &nbsp; &nbsp;glViewport(0, 0, Panel1.ClientWidth, Panel1.ClientHeight);
  78.  
  79.  &nbsp; &nbsp;glMatrixMode(GL_PROJECTION);
  80.  
  81.  &nbsp; &nbsp;glLoadIdentity;
  82.  
  83.  &nbsp; &nbsp;gluPerspective(45, Panel1.ClientWidth/Panel1.ClientHeight, 0.1, 1024);
  84.  
  85.  &nbsp;end;
  86.  
  87. end;
  88.  
  89.  

_________________
http://www.rochus.net


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

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

das liegt soweit ich das sehe am OnFormPaint..

pack den Code den du da hast mal in's Application.OnIdle.. :)
Also so:

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


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 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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