WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Home Cockpit - Das Forum für die "Bastler" (http://www.wcm.at/forum/forumdisplay.php?f=55)
-   -   Open GL vs TCanvas (http://www.wcm.at/forum/showthread.php?t=158058)

philharmony 08.02.2005 03:28

Hmmm, also OpenGL liesst sich zumindest als doch machbar in sich.
Was ich noc nicht verstehe ist: wie kriege ich Delphi dazu, OpenGL zu benutzen?
Also welche zeilen muss ich schreiben damit das genommen wird und wie geht es dann weiter, kann ich dann die OpenGL-befehle einfach so hinschreiben oder müssen die noch "Delphisiert" werden?
Mein Problem ist, ich bin kein Programierer, ich habe nicht wirklich den Überblick wie man Objekte erstellt (so dass es auch funktioniert), was genau eine Klasse ist usw, irgendwie hat das nie Geklappt.
Ich kann einfach sehr gut logisch denken und auf TCanvas sah das ND auch wirklich brauchbar aus und hat sich Variabel-äbhängig bewegt, nur war es hat grottenlangsam.
Gruss Phil

AUA166 08.02.2005 08:57

Hallo!

Schau doch mal bei NeHe nach. Dort sind meines Wissens nach alle Tutorials auch in delphi vorhanden.

MfG
Stephan

MarkusV 08.02.2005 09:06

Hallo Phil,

> Was ich noch nicht verstehe ist: wie kriege
> ich Delphi dazu, OpenGL zu benutzen?

> Also welche zeilen muss ich schreiben damit das genommen
> wird und wie geht es dann weiter,

Genau das nimmt dir z.B. die cgLib von www.delphi3.net
ab. Ich vermute, daß deren aktueller Nachfolger, DOT, das genau
so macht.

Konkret passiert folgendes: standardmäßig ist das Hauptfenster
einer Applikation ein Nachfolger der Klasse TForm. In cgLib für
Delphi wird das durch TcgForm ersetzt. TcgForm ist eine Klasse,
die mit TForm identisch ist, aber beim Initialisieren den OpenGL-
spezifischen Code hinzufügt. Das ist Systemprogrammierung, die
dich nicht zu interessieren braucht (Stichwort: Pixel Format
Descriptors) und die deswegen komplett in der Klasse TcgForm
versteckt wird. Bei DOT wird es ähnlich sein.

Alles, was du als Programmierer tun muß, ist

TFlightInstrumentsForm = class(TForm)

durch

TFlightInstrumentsForm = class(TCGForm)

zu ersetzen.

Dann fehlt nur die Initialisierung von OpenGL. Bei cgLib wird
das durch den Befehl "InitGL" erledigt, der in der Standard-
Routine "FormCreate" aufgerufen wird. (FormCreate wird von
Delphi ja immer dann erzeugt, wenn du bei TForm / TcgForm das
Event "OnCreate" definierst.)

Die komplette Initialisierung von OpenGL sieht bei mir so aus:

// OpenGL initializations
InitGL; // this is specific to the Delphi OpenGL headers.
// OpenGL initialization code concering 2D projections
glLoadIdentity();
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_MODELVIEW);
glOrtho(0, 1.0*displaySize, 0, 1.0*displaySize , -1, 1);

Das ist alles. glLoadIdentify setzt das Koordinatensystem
zurück, glViewport definiert, in welchem Bereich von deinem
Fenster zu zeichnen willst, und der Rest definiert Kamera-
position und 2D-Koordinatensystem mit dem Größenbereich
x = 0..displaySize, y = 0..displaySize

Fertig. ;)

> kann ich dann die OpenGL-befehle einfach so hinschreiben
> oder müssen die noch "Delphisiert" werden?

Das ist das Schöne. Wenn du Delphi erst einmal initialisiert
hast, dann kannst du alle Delphi-Befehle auf allen Systemen
und Sprachen identisch verwenden. Da muß nichts angepasst
werden.

Das ganze sieht dann z.B. so aus, am Beispiel des PLIs, der
anzeigt, bei welchem Pitch-Winkel der Stall einsetzen würde
(B747-400 PFD):

Zitat:

procedure THorizon.DrawPitchLimit;
var PLIpitch : single;
const HorPtchScale = 2.0;
begin
// Pitch Limit is received in PS1.3 pixel unit. Convert ...
PLIpitch := 5*(57 - Limit) / 12;
// Of course, the PL indicator is only shown with Flaps OUT of up position
if (FlpYpos <> 261) and (FlpYPos <> 0) then
begin
glPushMatrix; // Push #03
glTranslated(0,PLIpitch*HorPtchScale,0);
glColor3f(1,1,0); glLineWidth(0.6*FDBarWidth);
glBegin(GL_LINES);
glVertex2f(-26, 0);
glVertex2f(-19, 0);
glVertex2f(-19, 0);
glVertex2f(-19, -2);

glVertex2f(-26 , 3); glVertex2f(-24, 0);
glVertex2f(-24.5, 3); glVertex2f(-22.5, 0);
glVertex2f(-23 , 3); glVertex2f(-21, 0);

glVertex2f( 26 , 3); glVertex2f( 24, 0);
glVertex2f( 24.5, 3); glVertex2f( 22.5, 0);
glVertex2f( 23 , 3); glVertex2f( 21, 0);

glVertex2f( 19, -2);
glVertex2f( 19, 0);
glVertex2f( 19, 0);
glVertex2f( 26, 0);
glEnd();
glPopMatrix;
end;
end;

Du siehst, hier passiert nicht viel. Nach einem Stück Logik
am Anfang werden nur Linien (GL_LINES) gezeichnet. glVertex2f
(2f = 2 Floating Point Numbers) sind einfach Vektoren,
die Anfangs- und Endpunkte jeweils einer Linie angeben. Das
Ganze wird in Gelb (glColor3f(1,1,0) mit RGB = 1,1,0) gezeichnet.

Viele Grüße,

Markus

okuhl 08.02.2005 10:17

Hallo,

danke für die Links. Die sind wirklich sehr interessant!

Ich habe mal flüchtig gelesen, dass Fonts unter OpenGL leicht problematisch wären. Markus, Du solltest damit doch schon Erfahrungen gemacht haben. Ist das wirklich ein Problem oder nur ein Gerücht?

Gruss,
Ollie.

philharmony 08.02.2005 13:09

GEILLLLL, ich fange an es zu verstehn, sollte echt kein Hexenwerk sein.
D.H. die cgLib fügt Delphi eine Komponente hinzu die OpenGl "kann", richtig?
Das fenster ist dann einfach vom Typ TCGForm, richtig? (z.b. anstatt TForm mit TCanvas drauf)
subbigeil, jetzt muss ich nur noch warten bis meine BU rum is dann setz ich mich damit echt mal auseinander, mal schaun, vllt krieg ich ja ne vernünftige Freeware hin ;)
wie schauts denn aus mit Aktuellen FSUIPC-Offsetlisten?
Ich hatte immer das problem, dass ich die Longitide und Latitude koordinaten mit so nem riesen Schlüssel umrechnen musste was zu nem Fehler geführt hat weil der Variablenspeicher zu klein war oder so.
Gruss Phil

MarkusV 08.02.2005 16:42

Hallo Ollie,

> Ich habe mal flüchtig gelesen, dass
> Fonts unter OpenGL leicht problematisch
> wären. Markus, Du solltest damit doch
> schon Erfahrungen gemacht haben. Ist das
> wirklich ein Problem oder nur ein Gerücht?

das ist so schon richtig und kein Gerücht. OpenGL bringt von Haus aus wenig bis keine Unterstützung für Fonts mit. Im wesentlich muß man "selbst" Objekte (Bitmaps, Texturen oder Vektorlisten) definieren, die man später als einzelne Buchstaben verwenden kann.

Es gibt jedoch einige Bibliotheken, die einem Programmierer diese Arbeit abnehmen. Gerade unter Windows gibt es einen Befehl, der Truetype-Fonts (praktisch alle Windows-Standardschriftarten) in Vektorlisten umwandelt. Die cgLib (cgFont) von Delphi3d.net versteckt auch hier wieder die Details vor dem User.

Man sollte aber die Grundlagen kennen. Ich habe eine Weile gebraucht, bis ich meine Probleme gelöst hatte. Letztlich habe ich einen für mich idealen Font ausgewählt und die cgFont-Bibliothek ein wenig modifiziert und bin inzwischen sehr zufrieden damit.

Markus

MarkusV 08.02.2005 16:44

> D.H. die cgLib fügt Delphi eine
> Komponente hinzu die OpenGl "kann",
> richtig? Das fenster ist dann einfach
> vom Typ TCGForm, richtig? (z.b. anstatt
> TForm mit TCanvas drauf)

Genau. Streng genommen ist es sogar nur eine einfache Unit, die man nicht als Komponente installieren muß ,sondern nur mit "uses" einbinden muß. Aber das sollte eigentlich alles aus den Programmbeispielen sehr schnell klar werden.

Markus

AUA166 08.02.2005 18:30

Hi!

Ja, fonts sind sicherlich unter OpenGL ein heißes Thema. Das Rendern der Schriften kann zum bottleneck werden. Hier ist eine gute Beschreibung der bereits vorhandenen Font libs für OGL:
http://www.opengl.org/resources/features/fontsurvey/

Falls man unter Windows bleibt würde ich WGL empfehlen.

MfG
Stephan

MarkusV 08.02.2005 20:50

> Falls man unter Windows bleibt würde ich WGL empfehlen.

:D Genau das tut die cgFont-Unit für Delphi von delphi3D.net. Das wird geschickt vor dem User versteckt, aber wenn man sich den Quellcode anschaut, passiert genau das: ein Aufruf von wglUseFontOutlines.

Markus


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag