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

Aktuelle Zeit: Fr Jul 18, 2025 21:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Mär 30, 2007 11:15 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Hallo!

Delphi 2007, aktuelle OpenGL Header hier aus dem Forum. Programm mit einem extra Form, auf dem sich ein Panel befindet auf dessen Handle OpenGL initialisiert wurde.

Wenn das Programm nun läuft und ich das Fenster mit OpenGL verschiebe oder Schließe werden alle anderen "normalen" Windowsfenster statt mit dem regulären Inhalt mit Teilen der OpenGL Ausgabe angezeigt. So auch die komplette Taskleiste und Systray Icons.

Das OpenGL Fenster wird mit
Parent:= NIL;
ParentWindow := GetDesktopWindow;
initialisiert, damit es unabhängig vom Rest des Programmes ist.

Jemand eine Idee, woran das liegen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 30, 2007 12:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also so genau kann ich das jetzt nicht sagen, das die Informationen alle ein bisschen zerstückelt sind. Aber dein Renderfenster ist ein Unterfenster des Desktops? Und da denke ich, dass der Desktop sich deswegen solche Dinge gefallen lässt ohne sich neuzuzeichnen. Weil wenn es ein eigenständiges Fenster wäre, dann würde er das wissen und würde sich dort neu zeichnen.

Ein Fenster als Kind des Desktops zu setzen solltest du nur dann machen wenn es wirklich sein muss. Aber ich denke, wenn du dem Desktop beim Verschieben des Fenster ein WM_PAINT sendest könnte das evtl. schon ausreichen. Aber Vorsicht! Ist nur ein Tipp und es kann passieren, dass ein manueller Aufruf von WM_PAINT in einer Rekursionen endet. Vor allem weiß ich nicht was du sonst noch machst bzw was du überhaupt damit vor hast?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 30, 2007 12:18 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
"Hai auch!" (<-- Dori)

Ich will meinen OpenGL Kram wirklich einfach nur in einem neuen Fenster. Also nicht MDI/SDI sondern auch in der Taskleiste. Mehr soll das garnicht können. Dann kann man im Hauptprogramm bedienen, und im anderen Fenster anschauen.

Der RenderThread ruft einfach nur periodisch RenderAPicutre auf.


Hauptform (als Demo)
Code:
  1. unit Unit3;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, uOpenGL_Form;
  8.  
  9. type
  10.   TForm3 = class(TForm)
  11.     procedure FormCreate(Sender: TObject);
  12.   private
  13.     { Private-Deklarationen }
  14.   public
  15.     gl: TOpenGLForm;
  16.     { Public-Deklarationen }
  17.   end;
  18.  
  19. var
  20.   Form3: TForm3;
  21.  
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. procedure TForm3.FormCreate(Sender: TObject);
  27. begin
  28.   gl := TOpenGLForm.Create(Self);
  29.   gl.Active := True;
  30. end;
  31.  



GL-Form
Code:
  1.  
  2. unit uOpenGL_Form;
  3.  
  4. interface
  5.  
  6. {$Region 'uses'}
  7. uses
  8.   // Delphi/Windows Units
  9.   AdoDB,
  10.   ActiveX,
  11.   Buttons,
  12.   Classes,
  13.   Controls,
  14.   ComObj,
  15.   ComCtrls,
  16.   Contnrs,
  17.   DB,
  18.   Dialogs,
  19.   ExtCtrls,
  20.   ExtDlgs,
  21.   Forms,
  22.   Graphics,
  23.   JPEG,
  24.   Menus,
  25.   Messages,
  26.   ShellApi,
  27.   StdCtrls,
  28.   SysUtils,
  29.   Types,
  30.   Variants,
  31.   Windows,
  32.   Textures,
  33.  
  34.   ... viele weitere ...
  35.  
  36.   , uOpenGL_RenderThread
  37.   , uGlobalObjects
  38.   , dglOpenGL
  39.   ;
  40. {$EndRegion}
  41.  
  42. type
  43.   TOpenGLForm = class(TForm)
  44.   private
  45.     FDC         : HDC;    // Device Context
  46.     FRC         : HGLRC;
  47.  
  48.     FActive: Boolean;  // Rendering Context
  49.     FRenderThread: TRenderThread;
  50.  
  51.     FContainerPanel: TPanel;
  52.  
  53.     procedure KillThread;
  54.     procedure FormClose(_Sender: TObject; var Action: TCloseAction);
  55.     procedure FormCloseQuery(_Sender: TObject; var _CanClose: Boolean);
  56.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  57.     procedure FormResize(Sender: TObject);
  58.     procedure SetActive(const Value: Boolean);
  59.   public
  60.     property Active: Boolean read FActive write SetActive;
  61.     property DC: HDC read FDC;
  62.     property RC: HGLRC read FRC;
  63.     property Container: TPanel read FContainerPanel;
  64.  
  65.     procedure RenderAPicture; virtual;
  66.     constructor Create(_Owner: TComponent); override;
  67.     destructor Destroy; override;
  68.   end;
  69.  
  70.  
  71. implementation
  72.  
  73. { TOpenGLForm }
  74.  
  75. constructor TOpenGLForm.Create(_Owner: TComponent);
  76. begin
  77.   inherited CreateNew(_Owner, 0);
  78.  
  79.   Left := 0;
  80.   Top := 0;
  81.  
  82.   {$Region 'Parent zuweisen'}
  83.   if assigned(_Owner) then begin
  84.     if _Owner.InheritsFrom(TWinControl) then begin
  85. //      Parent := (_Owner as TWinControl);
  86.     end;
  87.   end;
  88.   {$EndRegion}
  89.  
  90.   Parent:= NIL;
  91.   ParentWindow := GetDesktopWindow;
  92.  
  93.   Width := Screen.Width;
  94.   Height := Screen.Height;
  95.   OnKeyDown := FormKeyDown;
  96.   DoubleBuffered := True;
  97. //  BorderStyle := bsNone;
  98.   KeyPreview := True;
  99.   if not isDeveloperMode then begin
  100.     FormStyle := fsStayOnTop;
  101.   end;
  102.  
  103.   FContainerPanel := TPanel.Create(Self);
  104.   with FContainerPanel do begin
  105.     Parent := Self;
  106.     Align := alNone;
  107.     BevelEdges := [];
  108.     BevelInner := bvNone;
  109.     BevelOuter := bvNone;
  110.     BevelKind := bkNone;
  111.     ClientWidth := Screen.Width;
  112.     ClientHeight := Screen.Height;
  113.   end;
  114.   Show;
  115. //  Align := alClient;
  116.   FActive := False;
  117.  
  118.   {$Region 'RenderThread erzeugen und zuweisen'}
  119.   FRenderThread := TRenderThread.Create;
  120.   with FRenderThread do begin
  121.     CallBackProcedure := RenderAPicture;
  122.     Suspend;
  123.   end;
  124.   {$EndRegion}
  125.  
  126.  
  127.   InitOpenGL;          // OpenGL Initialisieren
  128.  
  129.   {$Region 'DeviceContext und RenderingContext erzeugen und zuweisen'}
  130.   FDC := GetDC(FContainerPanel.Handle);
  131.   FRC := CreateRenderingContext(FDC, [opDoubleBuffered], 16, 24, 0, 0, 0, 0);
  132.   ActivateRenderingContext(FDC, FRC);
  133.   {$EndRegion}
  134.  
  135.   OnCloseQuery := FormCloseQuery;
  136.   OnClose := FormClose;
  137.   OnResize := FormResize;
  138. end;
  139.  
  140. destructor TOpenGLForm.Destroy;
  141. begin
  142.   DeactivateRenderingContext;
  143.   DestroyRenderingContext(FRC);
  144.   ReleaseDC(FContainerPanel.Handle, FDC);
  145.   FreeAndNil(FContainerPanel);
  146.   inherited Destroy;
  147. end;
  148.  
  149. procedure TOpenGLForm.FormClose(_Sender: TObject; var Action: TCloseAction);
  150. begin
  151.   KillThread;
  152. end;
  153.  
  154. {$Region 'procedure TOpenGLForm.FormCloseQuery(_Sender: TObject; _CanClose: Boolean); // Form schließen'}
  155. procedure TOpenGLForm.FormCloseQuery(_Sender: TObject; var _CanClose: Boolean);
  156. begin
  157. //  KillThread;
  158. //  DeactivateRenderingContext;
  159. //  DestroyRenderingContext(FRC);
  160. //  ReleaseDC(Handle, FDC);
  161. end;
  162. {$EndRegion}
  163.  
  164. procedure TOpenGLForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  165. begin
  166.   if Key = VK_ESCAPE then begin
  167.     Self.Close;
  168.   end;
  169. end;
  170.  
  171. procedure TOpenGLForm.KillThread;
  172. //var
  173. //  CrashCount: integer;
  174. begin
  175.   if assigned(FRenderThread) then begin
  176.     FRenderThread.WantsToClose := True;
  177.     FRenderThread.Delay := 1;
  178.     FRenderThread.CallBackProcedure := NIL;
  179.     FRenderThread.ForceResume;
  180.     FRenderThread := NIL;
  181.  
  182. {    CrashCount := 0;
  183.     repeat
  184.       Application.ProcessMessages;
  185.       inc(CrashCount);
  186.     until (CrashCount > 1000) or not assigned(FRenderThread);
  187.  
  188.     if assigned(FRenderThread) then begin
  189.       FreeAndNil(FRenderThread);
  190.     end;
  191.  }
  192.   end;
  193. end;
  194.  
  195. procedure TOpenGLForm.SetActive(const Value: Boolean);
  196. begin
  197.   FActive := Value;
  198.   {$Region 'RenderThread (de)aktivieren'}
  199.   if assigned(FRenderThread) then begin
  200.     if FActive then begin
  201.       FRenderThread.ForceResume;
  202.     end else begin
  203.       FRenderThread.Suspend;
  204.     end;
  205.   end;
  206.   {$EndRegion}
  207. end;
  208.  
  209.  
  210. procedure DrawQuad(pX, pY, pZ, pWidth, pHeight : Single);
  211. begin
  212.   glBegin(GL_QUADS);
  213.     glTexCoord2f(0,0); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ);
  214.     glTexCoord2f(1,0); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ);
  215.     glTexCoord2f(1,1); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ);
  216.     glTexCoord2f(0,1); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ);
  217.   glEnd;
  218. end;
  219.  
  220. procedure TOpenGLForm.RenderAPicture;
  221. begin
  222.   if not Assigned(FRenderThread) then exit;
  223.   if (FRenderThread.Suspended) then exit;
  224.  
  225.  
  226.   {
  227.   glMatrixMode(GL_PROJECTION);
  228.   glLoadIdentity;
  229.   glViewPort(0, 0, ClientWidth, ClientHeight);
  230.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  231.  
  232.   // In orthagonale (2D) Ansicht wechseln
  233.   glLoadIdentity;
  234.   glOrtho(0,ClientWidth,ClientHeight,0, -1,1);
  235.   glMatrixMode(GL_MODELVIEW);
  236.  
  237.   glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
  238. //  DrawQuad(10,10,0,100,100);
  239.  
  240.    }
  241.  
  242.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  243.  
  244.   glMatrixMode(GL_PROJECTION);
  245.   glLoadIdentity;
  246. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  247.  
  248.   glMatrixMode(GL_MODELVIEW);
  249.   glLoadIdentity;
  250.  
  251.   glTranslatef(0, 0, -5);
  252.  
  253.   glBegin(GL_QUADS);
  254.     glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
  255.     glColor3f(0, 1, 0); glVertex3f(1, 0, 0);
  256.     glColor3f(0, 0, 1); glVertex3f(1, 1, 0);
  257.     glColor3f(1, 1, 0); glVertex3f(0, 1, 0);
  258.   glEnd;
  259.  
  260.   SwapBuffers(DC);
  261.  
  262. end;
  263.  
  264. procedure TOpenGLForm.FormResize(Sender: TObject);
  265. var tmpBool : Boolean;
  266. begin
  267.   glViewport(0, 0, ClientWidth, ClientHeight);
  268.   glMatrixMode(GL_PROJECTION);
  269.   glLoadIdentity;
  270. //  gluPerspective(45.0, ClientWidth/ClientHeight, NearClipping, FarClipping);
  271.  
  272.   glMatrixMode(GL_MODELVIEW);
  273.   glLoadIdentity;
  274. //  IdleHandler(Sender, tmpBool);
  275. end;
  276.  
  277. end.
  278.  



// edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 30, 2007 14:13 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Also das Problem besteht auch, wenn man das Form in dem anderm Form drinnen lässt, und nicht den Desktop als Parent nimmt.

Es geht sogar soweit, dass wenn ihr das Form in dem anderem Form soweit nach rechts unten schiebt, dass ein Bereich nicht mehr zu sehen ist,
wird dieser trotzdem gerendert anstatt versteckt. Dieser Bereich ist dann auch der, der später von den anderen "Übermalten" Programmen nicht mehr neu gezeichnet wird.

Habt ihr Überhaupt schonmal einen OpenGL Bereich gehabt, der nicht fix an einer Stelle in eurem Programm verankert war?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 30, 2007 15:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Als erstes eines mal vorweg. Der Thread ruft RenderAPicture ja synchron auf, oder? Wenn nein, dann wundert es mich 1.) dass du etwas siehst und 2.) sollte das immer synchron aufgerufen werden oder alles im Thread stattfinden. Wobei ich den nutzen eines Threads dort auch nicht so ganz sehe. Aber das ist eine andere Sache.

Eine Sache die mich persönlich auch noch irritiert ist folgendes. Du erstellst ein Fenster welches ein Panel besitzt. Diesem weißt du aber die Größe des Bildschirmes zu. Da dein Fenster aber einen Rand haben müsste ist das Panel größer als der maximale sichtbare Bereich. Und dadurch, dass du das OpenGL komplett im Fenster darstellst ist das Panel auch überflüssig. Bzw wenn du ein Panel benutzt dann sollte das Panel auch die Größe haben die sichtbar ist. Also es sollte dann nicht irgendwo raus reichen.

Du hast auch nirgendswo Code mit dem du deine Ansicht einstellst. Das gluPerspective ist überall sauber auskommentiert.

DoubleBuffered bei einem Form zu setzen brauchst du bei OpenGL nicht. Könnte da sogar eher noch nachteilig sein.

Typischerweise hällt sich OpenGL aber ziemlich genau an die Bereiche die mit dem DC verbunden sind.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 02, 2007 09:20 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Also das Problem scheint nicht nur komplett an mir zu liegen (scheinbar):

Wenn ich das Template für OpenGL 1.5 laufen lasse http://www.delphigl.com/do_download.php?f=8 und das Fenster über die Taskleiste ziehe, wird diese auch nicht mehr neu gezeichnet, wenn man das Fenster weiter zieht.

Jemand eine Idee, was man dagegen machen kann?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 02, 2007 09:23 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jetzt wirds aber langsam richtig komisch.

Also bei meinem Template läuft alles wunderbar. Ich hab auch noch nie von einem derartigen Verhalten gehört. Wenn unser Standard-Template so reagiert, dann scheint wohl irgendwas mit deinem Rechner nicht zu stimmen. Was für ein Betriebssystem hast du? Welcher GraKa? Und welchen GraKa-Treiber?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 02, 2007 09:28 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Windows XP Pro 32, ATI Mobility Radeo 9000 (Omega 3.8.330), Designs deaktiviert
evtl. liegt's wirklich an den Treibern, aber leider kann ich die "Offiziellen" nicht installieren, da meine GraKa halt Laptop-OEM ist, und der Hersteller (Maxdata) aktualisierte Treiber liefern muss anstelle von ATI, der hat aber nur knapp 3 Jahre alte auf dem FTP... (<-- und die haben mir das letzte Mal nur BlueScreen beschert, deswegen will ich die jetzt net unbedingt testen, weil ich dann noch net mal mehr in den Abgesicherten Modus herein kam...)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 02, 2007 09:45 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Ok, es schein wohl definitv an meinem Laptop zu liegen. Habe das Ganze eben auf einem anderen PC getestet, und das klappt es problemlos.

Bei mir kann man das OpenGL 1.5 Template auch nicht mit einem anderen Programm überdecken. *Seufz*

Interessant ist aber auch noch, dass ich mit dem Laptop (auch wieder mit dem Template) knapp 875-890 FPS schaffe, mit dem anderen PC (OnBoard ATI Radeon Xpress 200 mit Omega 3.8.273 eines Desktop PCs) aber nur knapp 60. Nun ja, da wird wohl V-Sync funktionieren...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 03, 2007 13:58 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mach mal die Designs aus. Vielleicht laufen die auch mit OGL und die kommen sich ins gehege.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Apr 03, 2007 15:02 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Die Designs sind das nicht, weil ich arbeite immer ohne, habe aber auch mit getestet.

Es liegt definitv an den GraKa Treiber, da ich die Programme nun auf diversen anderen PCs getestet habe, und es dort auch geht. Zusätzlich habe ich mittelns eines alten Images meiner Platte mit den Originaltreibern verifizierten können, dass es damit auch funktioniert.

Also scheint einfach das Problem bei den Omegatreibern mit meiner Laptop-GraKa zu liegen.

Hab mir jetzt nen neuen Laptop geholt, der hat das Problem nicht. Der alte war eh schon 3 Jahre alt.

Thema ist damit also soweit erledigt, ich danke allen für die Tips und Anregungen.

Thx!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 05, 2007 13:39 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm...ja...so kann man das auch lösen... :shock:

Falls du den alten noch da hast, kannste da mal versuchen neue Treiber zu installieren? Einfach nur interessehalber.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 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.011s | 15 Queries | GZIP : On ]