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

Aktuelle Zeit: Fr Jul 04, 2025 19:38

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: hoffe ein simples prob ...
BeitragVerfasst: Do Okt 24, 2002 21:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 21:55
Beiträge: 10
Huhu!

ich möchte meine OpenGL grafik nicht auf der Canvas der form ausgeben sondern auf der canvas eines Images.

dummerweise hab ich einen openglfehler dabei ...

soweit mein code: (nicht lachen is erst der anfang ;) )

Code:
  1.  
  2.  
  3.  
  4.  
  5. unit Gpspath;
  6.  
  7.  
  8.  
  9. interface
  10.  
  11.  
  12.  
  13. uses
  14.  
  15.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  16.  
  17.   Dialogs, ExtCtrls, OpenGl, Glut, StdCtrls;
  18.  
  19.  
  20.  
  21. type
  22.  
  23.   TForm1 = class(TForm)
  24.  
  25.     Image1: TImage;
  26.  
  27.  
  28.  
  29.     procedure FormCreate(Sender: TObject);
  30.  
  31.     procedure FormDestroy(Sender: TObject);
  32.  
  33.     procedure FormPaint(Sender: TObject);
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.   private
  46.  
  47.     { Private-Deklarationen }
  48.  
  49.  
  50.  
  51.     GLContext : HGLRC;
  52.  
  53.  
  54.  
  55.  
  56.  
  57.   public
  58.  
  59.     { Public-Deklarationen }
  60.  
  61.  
  62.  
  63.   end;
  64.  
  65.  
  66.  
  67. var
  68.  
  69.   Form1: TForm1;
  70.  
  71.  
  72.  
  73. implementation
  74.  
  75.  
  76.  
  77. {$R *.dfm}
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95. procedure TForm1.FormCreate(Sender: TObject);
  96.  
  97.  
  98.  
  99.         var pfd : TPixelformatdescriptor;
  100.  
  101.             formatindex : integer;
  102.  
  103.  
  104.  
  105. begin
  106.  
  107. fillchar(pfd, Sizeof(pfd),0);
  108.  
  109.         with pfd do begin
  110.  
  111.  
  112.  
  113.                 nSize           := SizeOf(pfd);
  114.  
  115.                 nVersion        := 1;
  116.  
  117.                 dwFlags         := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL;
  118.  
  119.                 iPixelType      := PFD_TYPE_RGBA;
  120.  
  121.                 cColorBits      := 24;
  122.  
  123.                 CDepthBits      := 32;
  124.  
  125.                 iLayertype      := PFD_MAIN_PLANE;
  126.  
  127.                         end;
  128.  
  129.  
  130.  
  131.  
  132.  
  133.         formatindex     := Choosepixelformat(image1.canvas.handle,@pfd);
  134.  
  135.         Setpixelformat(image1.canvas.Handle,Formatindex,@pfd);
  136.  
  137.         GLContext       := wglCreateContext(image1.canvas.handle);
  138.  
  139.         wglMakeCurrent(image1.canvas.Handle,GLContext);
  140.  
  141.  
  142.  
  143.  
  144.  
  145. end;
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157. procedure TForm1.FormDestroy(Sender: TObject);
  158.  
  159. begin
  160.  
  161.         wglMakeCurrent(image1.canvas.handle,0);
  162.  
  163.         wglDeleteContext(GLContext);
  164.  
  165. end;
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177. procedure TForm1.FormPaint(Sender: TObject);
  178.  
  179. var error : GLint;
  180.  
  181.  
  182.  
  183. begin
  184.  
  185.  
  186.  
  187.           glClearColor(1.0,1.0,0.0,0.0);
  188.  
  189.           glClear(GL_COLOR_BUFFER_BIT);
  190.  
  191.                               
  192.  
  193.  
  194.  
  195.         error := glgeterror;
  196.  
  197.  &nbsp; &nbsp; &nbsp; &nbsp;if error<>GL_NO_ERROR then
  198.  
  199.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise Exception.Create('Error in Paint'#13+gluErrorString(error));
  200.  
  201. end;
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209. end.
  210.  
  211.  
  212.  
  213.  


wenn mir wer schreiben könnte was ich da bisher falsch gemacht habe, wäre es echt super!

danke im voraus! :)

_________________
Das Gebet reinigt die Seele, der Schmerz reinigt den Körper!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 25, 2002 07:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Wenn ich das richtig sehe, ist Dein Pixel-Format ungülltig. Du versuchst, OpenGL mit einer Bit-Tiefe von 24 zu initialisieren. Bei meiner GeForce 4 Ti4200 geht das z.B. nicht. Ich könnte mich täuschen, aber ich hab' den Eindruck, je nach Treiber, dass 24-Bit nicht unterstützt wird. Versuch statt dessen 16 oder 32 Bit zu verwenden (also cColorBits := 16 oder cColorBits := 32)

Das nächste ist der Z-Buffer (cDepthBits) bei meien Testst mit der GeForce kam raus, dass per Hardware nur 16 oder 24-Bit unterstützt wird, da der Z-Buffer mit dem Stencil-Buffer geteilt wird. Das heisst: Maximal stehen 8 Bit für den Stencil-Buffer zur verfügung, die dann von den 32-Bit für die Zusatz-Buffer (Z und Stencil) abgehen. Zwar verwendest Du keinen Stencil, dennoch wird (vermutlich aus Verwalltungsgründen) der Z-Buffer mit max. 24 bit unterstützt (messwerte von GeForce 4 Ti4200 mit aktuellem Treiber). 32 ist zwar machbar, wird dann aber nicht von der Hardware unterstützt, wass sich zeimlich auf die Performance auswirkt. Außerdem sind die 32-Bit für Zusatz-Buffer nur dann verfügbar, wenn der Dekstop (oderVollbild-Modus) mit 32-Bit farbtiefe läuft. Die Größe des Zusatzbuffers (für Z und Stencil) und des Back-Buffers (farbitefe) sind also immer gleich. Das nur so nebenbei! Setzte also CDepthBits auf 16 oder 24. (Ist auch für 3D-Spiele im Normalfall völlig ausreichend!)

Was auch noch möglich ist, ist dass Du eine ältere Grafikkarte hast, die KEINEN Window-Mode unterstützt (müsste dann aber 'ne wirklich alte sein ;) )

_________________
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: Fr Okt 25, 2002 10:40 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 21:55
Beiträge: 10
hmmm das is aber im moment net das problem ...

wenn ich statt image1.canvas.handle, einfach nur canvas.handle nehme, also die canvas von form1 funktioniert alles! ... ich möchte das aber auf dem image1.canvas ausgeben ... und wenn ich das derart versuche bekomme ich eine invalid operation ---- zumindest ist das der errorstring den glgeterror zurückgibt ... :(

_________________
Das Gebet reinigt die Seele, der Schmerz reinigt den Körper!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 25, 2002 11:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Das kann schon das Problem sein, denn im einen Fall renderst Du auf die Form und im anderen auf ein Bitmap, was unterschiedliche Pixel-Formate und Unterstützungen mit sich führt. Denn, wie gesagt, wenn die Form das Pixel-Format untestützt, heisst das noch lange nicht, dass das Image das auch macht. Wenn es auf die Form klappt, aber auf das Image nicht, dann ist OpenGL auf jeden Fall in Ordnung aber das Format des Images wird von OpenGL NICHT unterstützt.

Überprüf doch einfach mal, ob überhaupt ein passendes Pixel-Format gefunden wurde. Da Du PFD_DRAW_TO_WINDOW angegeben hast, wag ich das zu bezweifeln (probier mal PFD_DRAW_TO_BITMAP). Einfach den Wert von FormatIndex überprüfen. Ist der 0 dann wurde kein passendes Pixelformat gefunden. Nach dem Setzen des Pixelformates überprüfen, ob dies gesetzt wurde (liefert SetPixelFormat True zurück?). Wenn nicht, hat das auch nicht geklappt. Beim Erstellen des RenderingContext (wglCreateContext) überprüfen, ob ein gülltiger Context erstellt wurde (ist GLContext <> 0). Wenn nein, kann das auch nicht klappen. Zum Schluß noch überprüfen, ob wglMakeCurrent ebenfalls True zurückliefert. Wenn einer der Schritte einen Fehler meldet, dann funktioniert das ganze Rendern nicht. Es ist bei Initialisierungen immer wichtig, jeden einzelnen Initialisierungs-Schritt daraufhin zu überprüfen, ob er erfolgreich war. Sonst wunder man sich später, warum dies oder jenes nicht geht!

Stellt sich die Frage, ob Du das Image überhaupt brauchst. Ich meine, wenn Du einen bestimmten Ausgabebereich auf Deiner Form haben willst, dann verwende einfach ein Panel dafür. Ist dann auf jeden Fall besser und müsste auch funktionieren.

Abschließend noch ein kleiner Tip: verwende PDF_DOUBLEBUFFER, damit Du dieses auch einschaltest. Sonst kann es (je nach Treiber) sein, dass Du ein Pixelformat OHNE Doublebuffer bekommst, was dann auch nicht unbedingt so der Hit ist. Ist allerdings beim Rendern auf Bitmaps/Images uninterresant.

_________________
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: Fr Okt 25, 2002 13:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 21:55
Beiträge: 10
ok ... der context haut net hin ....

habs nun so geändert und auch auf ein panel umgestellt quasi ..

Code:
  1.  
  2.  
  3.  
  4.  
  5. unit Gpspath;
  6.  
  7.  
  8.  
  9. interface
  10.  
  11.  
  12.  
  13. uses
  14.  
  15.  &nbsp;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  16.  
  17.  &nbsp;Dialogs, ExtCtrls, OpenGl, Glut, StdCtrls;
  18.  
  19.  
  20.  
  21. type
  22.  
  23.  &nbsp;TForm1 = class(TForm)
  24.  
  25.  &nbsp; &nbsp;Panel1: TPanel;
  26.  
  27.  
  28.  
  29.  &nbsp; &nbsp;procedure FormCreate(Sender: TObject);
  30.  
  31.  &nbsp; &nbsp;procedure FormDestroy(Sender: TObject);
  32.  
  33.  &nbsp; &nbsp;procedure FormPaint(Sender: TObject);
  34.  
  35.  
  36.  
  37.  &nbsp;private
  38.  
  39.  &nbsp; &nbsp;{ Private-Deklarationen }
  40.  
  41.  
  42.  
  43.  &nbsp; &nbsp;GLContext : HGLRC;
  44.  
  45.  
  46.  
  47.  &nbsp;public
  48.  
  49.  &nbsp; &nbsp;{ Public-Deklarationen }
  50.  
  51.  &nbsp;end;
  52.  
  53.  
  54.  
  55. var
  56.  
  57.  &nbsp;Form1: TForm1;
  58.  
  59.  
  60.  
  61. implementation
  62.  
  63.  
  64.  
  65. {$R *.dfm}
  66.  
  67.  
  68.  
  69. procedure TForm1.FormCreate(Sender: TObject);
  70.  
  71. var
  72.  
  73.  &nbsp;pfd : TPixelformatdescriptor;
  74.  
  75.  &nbsp;formatindex : integer;
  76.  
  77. begin
  78.  
  79. fillchar(pfd, Sizeof(pfd),0);
  80.  
  81.  &nbsp; &nbsp; &nbsp; &nbsp;with pfd do begin
  82.  
  83.  
  84.  
  85.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nSize &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; := SizeOf(pfd);
  86.  
  87.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nVersion &nbsp; &nbsp; &nbsp; &nbsp;:= 1;
  88.  
  89.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;dwFlags &nbsp; &nbsp; &nbsp; &nbsp; := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL;
  90.  
  91.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;iPixelType &nbsp; &nbsp; &nbsp;:= PFD_TYPE_RGBA;
  92.  
  93.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cColorBits &nbsp; &nbsp; &nbsp;:= 24;
  94.  
  95.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CDepthBits &nbsp; &nbsp; &nbsp;:= 32;
  96.  
  97.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;iLayertype &nbsp; &nbsp; &nbsp;:= PFD_MAIN_PLANE;
  98.  
  99.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;
  100.  
  101.  
  102.  
  103.  &nbsp; &nbsp; &nbsp; &nbsp;formatindex &nbsp; &nbsp; := Choosepixelformat(panel1.handle,@pfd);
  104.  
  105.  &nbsp; &nbsp; &nbsp; if(Setpixelformat(panel1.Handle,Formatindex,@pfd) = true) then messagedlg('alles klar',mtinformation,[mbOk],0);
  106.  
  107.  &nbsp; &nbsp; &nbsp; &nbsp;GLContext &nbsp; &nbsp; &nbsp; := wglCreateContext(panel1.handle);
  108.  
  109.  &nbsp; &nbsp; &nbsp; &nbsp;messagedlg('alles klar'+inttostr(GLcontext),mtinformation,[mbOk],0);
  110.  
  111.  &nbsp; &nbsp; &nbsp; &nbsp;wglMakeCurrent(panel1.Handle,GLContext);
  112.  
  113. end;
  114.  
  115.  
  116.  
  117.  
  118.  
  119. procedure TForm1.FormDestroy(Sender: TObject);
  120.  
  121. begin
  122.  
  123.  &nbsp; &nbsp; &nbsp; &nbsp;wglMakeCurrent(panel1.handle,0);
  124.  
  125.  &nbsp; &nbsp; &nbsp; &nbsp;wglDeleteContext(GLContext);
  126.  
  127. end;
  128.  
  129.  
  130.  
  131.  
  132.  
  133. procedure TForm1.FormPaint(Sender: TObject);
  134.  
  135. var
  136.  
  137.  &nbsp;error : GLint;
  138.  
  139. begin
  140.  
  141.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glClearColor(1.0,1.0,0.0,0.0);
  142.  
  143.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;glClear(GL_COLOR_BUFFER_BIT);
  144.  
  145.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
  146.  
  147.  
  148.  
  149.  &nbsp; &nbsp; &nbsp; &nbsp;error := glgeterror;
  150.  
  151.  &nbsp; &nbsp; &nbsp; &nbsp;if error<>GL_NO_ERROR then
  152.  
  153.  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;raise Exception.Create('Error in Paint'#13+gluErrorString(error));
  154.  
  155. end;
  156.  
  157.  
  158.  
  159. end.
  160.  
  161.  


und der GL context liefrt 0 zurück ... also funzt net ... was ist noch falsch ? :oops:

_________________
Das Gebet reinigt die Seele, der Schmerz reinigt den Körper!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 25, 2002 13:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Du verwendest das Handle des Pannels und nicht den Device-Context. Es gibt zwei möglichkeiten, an den Device-Context heran zu kommen:

1. MyDC := GetDC(Handle);
2. Verwende Panel.Canvas.Handle.

MyDC ist vom Typ HDC.

Canvas.Handle ist der von Delphi bereitsgestellte Device-Context des entsprechenden Objektes (Panel oder Form). Wenn Du diesen nicht verwenden möchtest, musst Du einen eigenen erstellen (mit GetDC) und diesen am Ende weider freigeben (mit ReleaseDC). Aber dafür gibt es eigentlich nicht unbedingt einen Grund...

Die Funktionen ChoosePixelFormat, SetPixelFormat, wglCreateContext und wglMakeCurrent erwarten alle einen Device-Context und nicht das Handle des Fensters.

_________________
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: Fr Okt 25, 2002 13:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 21:55
Beiträge: 10
und grad hab ich gemerkt das das choosepixlformat auch "0" zurückgibt :((

wieso denn nur ? :(

_________________
Das Gebet reinigt die Seele, der Schmerz reinigt den Körper!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 25, 2002 13:39 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
könntest du bitte quellcode nicht immer als ganzes posten? hier hätten sicher die änderungen gelangt. wäre ganz nett, wenn du die upload funktion verwenden würdest, das würde 1. die Überischt wahren 2. wertvollen traffic sparen 3. das volumen des forums klein halten


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 25, 2002 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Aus dem eben oben beschreibenen Problem. Ich würde Dir empfehlen die Tutorials über die Initialisierung von OpenGL auf DGL anzuschaun. Dort ist eigentlich alles beschrieben.

_________________
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: Fr Okt 25, 2002 13:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 06, 2002 21:55
Beiträge: 10
juhu --- das wars vielen dank! :))

_________________
Das Gebet reinigt die Seele, der Schmerz reinigt den Körper!


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


Wer ist online?

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