Zur Zeit habe ich ja ein TGLForm, das auf der kompletten Fläche OpenGL verwendet. Wenn ich Buttons hinzufüge, liegen sie auf dem schwarzen OGL Bereich auf. Labels werden seltsamerweise nicht gezeigt, auch wenn ich die Schriftfarbe auf weiss setze. Nun meine Frage: Kann ich dem Formblatt auch einen kleineren OpenGL Bereich zuweisen, so dass ich zB links einen 200x200 Bereich habe und rechts daneben ein ganz normales graues Formblatt mit meinen Buttons und Labels?
Zweite Frage: Wieso funzt Fullscreen bei mir nicht? Ich kann zwar korrekt auf Fullscreen umschalten, aber der OGL Bereich ist dann weg und ich sehe nur ein graues Formblatt.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Solche Sachen lassen sich am besten über ein TPanel lösen. Du machst also ein TPanel auf dem gerendert wird, und setzt deine normalen Controls halt daneben. Wenn du deinen Renderkontext dann erstellst, dann nimmst du nicht den Gerätekontext deiner Form, sondern den Gerätekontext des TPanels.
Wieso funzt Fullscreen bei mir nicht? Ich kann zwar korrekt auf Fullscreen umschalten, aber der OGL Bereich ist dann weg und ich sehe nur ein graues Formblatt.
Du musst dir einen Devicekontext holen und den Renderkontext aktivieren, nachdem du in den Vollbildmodus geschaltet hast.
Registriert: Do Mai 13, 2004 16:36 Beiträge: 116 Wohnort: Deutsch-Wagram (Österreich)
Kann man den RC auch "retten", also den selben weiterverwenden (z.B. mittendrin Auflösung wechseln)?
Oder muss man dann wirklich alle Texturen neu laden, alle Displaylisten neu compilieren usw.?
_________________ Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
@uzingLG :
Nix gegen deine Fragen, aber ich finde es reichlich unhöfliche (hast du bereits ein paar Mal gemacht) den Thread anderer Leute zu "hijacken", also für eigene Fragen zu nutzen die eigentlich nix mit dem Thema zu tun haben. Wenn du Fragen hast die nicht mit dem Thread direkt zu tun haben, dann poste das doch bitte in einem eigenen Thread.
Retten ist nicht drin, da du z.B. mit einem Wechsel in den Vollbildmodus von einem 32 Bit in einen 16 Bit oder sogar 8 Bit Modus schalten könntest, die prinzipiell alle unterschiedliche Einsprungpunkte und darauf hin optimierte Repräsentationen von Texturen und Objekten haben könnten.
Wenn du aber "weißt", dass du zur Laufzeit den Renderkontext wechselst, musst du halt deine Objekte so repräsentieren, dass sie sich jederzeit neu generieren (in Displaylisten, Texturen, VBOs, kompilierte Shader eintragen) können - ist aber gar nicht so umständlich, wie es auf den ersten Blick vielleicht aussieht.
Dann hijacke ich mal meinen Thread zurück. Sorry für die späte Antwort. Ich programmiere hier ja nur in der Firma und die letzten Tage musste defekte Drucker verprügeln und Windows neu installieren
Also: Ich soll ja das TPanel benutzen und den Renderkontext des Panels nehmen, aber wo genau und vorallem wie? Ich möchte daran erinnern, dass ich ein Neuling bin und eigentlich nur Zeit für die eigentliche Darstellung habe, nicht um mich in die Materie der Kontexte und Hardware-Schnittstellen einzuarbeiten. Daher nochmals danke für Antworten
procedure TGLForm.FormCreate(Sender: TObject);
begin
// Wenn gewollt, dann hier in den Vollbildmodus wechseln
// Muss vorm Erstellen des Kontextes geschehen, da durch den Wechsel der
// Gerätekontext ungültig wird!
// GoToFullscreen(1600, 1200, 32, 75);
// OpenGL-Funtionen initialisieren
InitOpenGL;
// Gerätekontext holen
DC := GetDC(Handle);
// Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
// Erstellten Renderkontext aktivieren
ActivateRenderingContext(DC, RC);
// Tiefenpuffer aktivieren
glEnable(GL_DEPTH_TEST);
// Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) "durchlassen"
glDepthFunc(GL_LESS);
// Löschfarbe für Farbpuffer setzen
glClearColor(0,0,0,0);
// Displayfont erstellen
BuildFont('MS Sans Serif');
// Idleevent für Rendervorgang zuweisen
Application.OnIdle := ApplicationEventsIdle;
// Zeitpunkt des Programmstarts für FPS-Messung speichern
StartTick := GetTickCount;
x:=0;
end;
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Beim Wechsel einer Auflösung werden normalerweise (es kann z.B. sein dass wenn du nur die Auflösung, also nicht die Frequenz oder die Farbtiefe änderst, der RC erhalten bleibt, aber das muss nicht sein) dein DC und RC ungültig, weshalb du dann jedesmal das hier wieder machen musst :
Code:
DC := GetDC(...);
RC := CreateRenderingContext(...);
ActivateRenderingContext(...);
Und dann ggf. auch wieder alle Ressourcen neuladen. Das muss man aber natürlich nur dann machen wenn man die Auflösung wechseln will während die Anwendung läuft. Wenn man das nur einmal beim Start der Anwendung macht, dann muss man halt zuerst die Auflösung setzen und dann wie gewohnt DC und RC initialisieren (siehe Template).
P.S. : Bitte benutze für Quellcode den Code- bzw. Pascal-Tag des Forums.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.