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

Aktuelle Zeit: So Jul 13, 2025 20:27

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jul 02, 2004 09:18 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 10:40 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Es gibt da einen Befehl glViewPort, damit kannst du dein Problem lösen.
0, 0 ist links unten.

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 10:46 
Offline
DGL Member
Benutzeravatar

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.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 11:33 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Danke, das klingt gut, probiere ich gleich mal aus :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 12:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Zitat:
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.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 13:29 
Offline
DGL Member

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 13:36 
Offline
DGL Member
Benutzeravatar

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.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 02, 2004 13:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
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.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 09:23 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
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;

Wo muss ich nun das TPanel reinsetzen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 09:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Code:
  1. DC := GetDC(MeinPanel.Handle);


Das wars, mehr musst du nicht machen um statt der Form das Panel zum Rendern zu benutzen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 09:35 
Offline
DGL Member

Registriert: Di Jun 22, 2004 12:13
Beiträge: 46
Juhu, das klappt :) Jetzt noch die Sache mit dem Fullscreen und ich gebe hier erstmal Ruhe ;)

procedure TGLForm.GoToFullScreen(pWidth, pHeight, pBPP, pFrequency : Word);
var
dmScreenSettings : DevMode;
begin
// Fenster vor Vollbild vorbereiten
WindowState := wsMaximized;
BorderStyle := bsNone;
ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
with dmScreenSettings do
begin
dmSize := SizeOf(dmScreenSettings);
dmPelsWidth := pWidth; // Breite
dmPelsHeight := pHeight; // Höhe
dmBitsPerPel := pBPP; // Farbtiefe
dmDisplayFrequency := pFrequency; // Bildwiederholfrequenz
dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
end;
if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
begin
MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
exit
end;
end;

Mars schrieb da oben etwas von Devicekontext holen und Renderkontext aktivieren. Ich nehme an das kommt in den obigen Block rein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jul 07, 2004 10:19 
Offline
DGL Member
Benutzeravatar

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:
  1. DC := GetDC(...);
  2. RC := CreateRenderingContext(...);
  3. 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.

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


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 » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]