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

Aktuelle Zeit: Mi Jul 16, 2025 17:11

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Handle übergeben
BeitragVerfasst: Mi Jun 06, 2007 15:10 
Offline
DGL Member

Registriert: Di Apr 24, 2007 17:03
Beiträge: 15
Hallo Community.

Ich bins mal wieder weil ich momentan etwas Hänge^^

und zwar habe ich in meinem derzeitigen Projekt 2 Forms.
Beide dieser Forms sind Statisch, und werden nicht dynamisch erzeugt.

Zuerst möchte ich die Ausgabe auf dem Panel1 der Form1 haben.

Dies Klappt auch soweit einwandfrei :)

Nun möchte ich ab einem Bestimmen Moment die OpenGL ausgabe aber auf dem Panel1 der Form 2 haben.

Momentan sehe ich da noch garnichts.
Hoffe ihr könnt mir helfen.

form1.formcreate:

Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   randomize; //Zufallsgenerator initialisieren
  4.   DC:=GetDC(panel1.Handle);  // Wo wird gemalt--> Panel
  5.   initopengl;  //OPEN GL initialisieren
  6.   RC:=CreateRenderingContext(DC,          //Device Contest
  7.                              [opDoubleBuffered], //Optionen
  8.                              32,          //ColorBits
  9.                              24,          //ZBits
  10.                              0,           //StencilBits
  11.                              0,           //AccumBits
  12.                              0,           //AuxBuffers
  13.                              0);          //Layer
  14.   ActivateRenderingContext(DC, RC);
  15.  
  16.   textureload; //texturen Laden
  17.   SetupGL; // OpenGL einrichten
  18.   Init; // Anwendung initialisieren
  19. end;


Wenn meine Bedingung auftritt habe ich momentan diesen Code:

Code:
  1.  
  2.   DeactivateRenderingContext;
  3.   DestroyRenderingContext(RC);
  4.   ReleaseDC(Handle, DC);
  5.  form1.visible:=false;
  6.  form2.visible:=true;
  7.  


im formcreate der Form2 steht :

Code:
  1. InitOpenGL;  // OpenGL-Funtionen initialisieren
  2.   DC := GetDC(form2.Panel1.Handle);  // Gerätekontext holen
  3.   RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);  // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  4.   ActivateRenderingContext(DC, RC);  // Erstellten Renderkontext aktivieren
  5.   glEnable(gl_cull_face);  
  6. //glEnable(GL_DEPTH_TEST);   // Tiefenpuffer aktivieren
  7.   glDepthFunc(GL_LESS);  // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
  8.   glClearColor(0,0,0,0);    // Löschfarbe für Farbpuffer setzen
  9.   BuildFont('MS Sans Serif');  // Displayfont erstellen
  10.   Application.OnIdle := ApplicationEventsIdle;  // Idleevent für Rendervorgang zuweisen
  11.   StartTick := GetTickCount;   // Zeitpunkt des Programmstarts für FPS-Messung speichern


aber ich sehe leider nichts auf dem Panel meiner Form 2 auch wenn die berechnungen funktionieren.
das habe ich schon getestet.
er geht auch in den Render Loop, aber ein Ausgabe? ne


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 15:42 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hast du an das Swapbuffers bei Form2 gedacht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 15:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das Visible hat nichts mit dem OnCreate zu tun. Sobald deine Anwendung startet wird Form1 erstellt und direkt hinterher Form2. Das bedeutet du musst die OpenGL Initialisierung entweder in das OnShow packen oder in dem OnShow einmal ActivateRenderContext aufrufen um den RC an den aktiven Thread (gibt bei dir nur den VCL Thread) zu binden. Ehrlich gesagt wundert es mich gerade auch etwas warum du überhaupt etwas auf Form1 siehst. Weil eigentlich ein RC nach dem ersten RC aktiviert wird.

Falls du etwas mit OpenGL im OnResize tust solltest aber nach dem erfolgreichen Initialisieren eine Variable des Forms füllen und diese im OnResize überprüfen. Also erst etwas tun wenn es erfolgreich erledigt wurde.


Kannst du eigentlich häufig zwischen den Forms hin und herwechseln? Ich frage das deswegen, da ActivateRenderContext alle OpenGL Funktionspointer lädt. Das Dauert durchaus etwas. Was aber in deinem wahrscheinlich gar nicht nötig wäre. Evtl sollte dort auch eine globale Variable seine Dienste tun. Also nach dem ersten Laden diese Variable setzen und falls diese gesetzt ist dann den dritten Parameter bei ActivateRenderContext auf False. Dann geht das Aktivieren ziemlich schnell.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 17:04 
Offline
DGL Member

Registriert: Di Apr 24, 2007 17:03
Beiträge: 15
ok ich habe es jetzt soweit geschafft.

Ich hatte echt nicht daran gedacht das das Formcreate garnicht durchlaufen wird^^

Jetzt habe ich nur noch ein Problem, was mir sehr schleierhaft ist.

Am anfang lade ich für die Form1 meine Texturen, und es geht alles einwandfrei.
Jetzt wechsel ich in die Form2 --> es geht alles einwandfrei
Jetzt wechsel ich in die Form1 --> Alle meine Texturen sind weg, und ich muss meine Procedure Textureload neu aufrufen.

Warum?
Wer gibt denn bitte meine Texturen frei?
(ist ein Array of GLUint)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 19:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du hast 2 RCs und jeder RC hat seine eigenen Texturen. Wenn du einen RC löscht dann sind auch die Texturen weg. Dann musst du diese wieder laden. Aber da du hin und her wechselt (wonach ich oben ja auch gefragt habe), mache mal bitte folgendes.

Im OnCreate erstellst du deine RCs.
Im OnShow rufst du ActivateRenderContext(xx, xx, false) auf.
Beim Wechsel machst du nichts weiter also Form1 zu verstecken und Form2 zu zeigen.
Im OnDestroy eines Fensters gibst du den RC und DC wieder frei.

Wenn Form2 erzeugt wird und der RC erstellt ist rufst du folgendes auf. wglShareLists(Form2.RC, Form1.RC); (Oder mal vertauschen. Weiß nicht genau) Damit teilst dem RC von Form2 mit, dass er alle Texturen des RCs von Form1 benutzen soll.

Wenn du später einmal alle beiden Fenster gleichzeitig darstellen willst musst du vor JEDEM Zeichnen den entsprechenden Kontext aktivieren. Pro Thread kann nur ein Kontext aktiv sein. Deswegen müsste man das so machen. Und dann so wie ich das oben gepostet habe. Derzeit musst du den nur ein Mal aktivieren, da nicht beie gleichzeitig zeichnen sondern das durch die sichtbarkeit geregelt wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 06, 2007 19:55 
Offline
DGL Member

Registriert: Di Apr 24, 2007 17:03
Beiträge: 15
Danke dir.

Du hast mir sehr geholfen :top:


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 5 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 | 17 Queries | GZIP : On ]