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 06.02.2005 20:31

Open GL vs TCanvas
 
Hi, in meinen letzren versuchen PFD und ND in Delphi zu Programieren habe ich immer die TCanvas verwendet, es hat grundsätzlich auch geklapt, aber es war einfach wahnsinnig langsam.
Dann gab mir jmd den Tip, ich solle es mit OpenGL probieren, klang auch gut, allerdings: WIE GEHT DAS?
Ich bin kein Programierer, desshalb kommt auch nur Delphi in Frage, denn da kann ich mich so halbwegs durchhangeln.
Mein problem ist, wie benutze ich OpenGL? also mit welchem Befehl sage ich Delphi: "Mal mir in das Fenster da einen schwarzen Halbkreis!"?
Kennt ihr da gute links oder hat jmd eine sammlung an befehlen und Programierbeispielen?
Gruss Phil

MarkusV 06.02.2005 21:58

Re: Open GL vs TCanvas
 
Hallo Phil,

> aber es war einfach wahnsinnig langsam.

... genau das habe ich erwartet, wie ich die Überschrift deines Beitrages gelesen habe. TCanvas ist eine Standard-Windows-Komponente und es ist bekannt, daß diese recht langsam sind.

> Mein problem ist, wie benutze ich
> OpenGL? also mit welchem Befehl sage
> ich Delphi: "Mal mir in das Fenster da
> einen schwarzen Halbkreis!"?

Vielleicht eine Vorausbemerkung, die ich in ähnlicher Form bereits in einem Beitrag vor ein paar Tagen im gleichen Forum zum Thema " Was hälts Du von einem OpenSource-Glascockpit-Projekt?" gemacht habe. Ich habe mir ein voll funktionsfähiges PFD und ND für die 747-400 mit einer Schnittstelle zum PS1.3 (aber nicht FS2004!). Das ganze ist in Delphi und OpenGL programmiert...

Du mußt im Prinzip zwei Probleme lösen. Das erste Problem sind sog. Headers für OpenGL, also Units, die die OpenGL-Bibliotheken laden und dir die OpenGL-Variablen, -Konstanten und -Funktionen zur Verfügung stellen sowie ein Fenster erstellen, in welchem du mit OpenGL zeichnen kannst. Das Problem ist auf http://www.delphi3d.net bereits gelöst. Diese Seite stellt alles zur Verfügung, was du brauchst, wenn du mit Delphi OpenGL-Grafiken erstellen willst. Unter -> Downloads -> Libraries findest du alles wichtig. Ich selbst habe noch mit cgLib gearbeitet, inzwischen gibt es DOT, was ich noch nicht kenne. Das klappt sicher auch.

Das andere Problem ist dein OpenGL-Programm. Du mußt dir ein paar Grundkenntnisse über OpenGL aneignen. Im wesentlichen mußt du den Kamerastandpunkt, das Koordinatensystem usw festlegen und dann deine Displays zeichnen. Die Anfänge lernst du ziemlich schnell aus den Beispielen von Delphi3d.net oder auch aus dem Kurs bei NeHe: http://nehe.gamedev.net/
Der Rest ist Übung und kommt von alleine und irgendwann bist du dann auch hier:

http://www.wcm.at/forum/attachment.p...postid=1524944

Viel Erfolg,

Markus

DeLaPlata 07.02.2005 08:40

das ist des Pudels Kern -->
 
OpenGL geht nur bei PS1.3 !!!!!!!!!!!!!!!

Das kannst du bei FS2004 vergessen !!!

rico

Karsten Krispin 07.02.2005 11:48

was hat denn ein eigenständiges Programm was mit oGL arbeitet mit dem FS zu tun?

MarkusV 07.02.2005 13:22

Nichts.

Aber es heißt doch "Don't feed the trolls".

AUA166 07.02.2005 16:14

Hi!

Must have für die OGL Programmierung:
http://fly.cc.fer.hr/~unreal/theredbook/

MfG
Stephan

philharmony 07.02.2005 18:50

Ok, danke erstmal für die Links.
Mal ne andere Frage: Open GL ist ja voll für 3D ausgelegt, ist es da nicht mit Kanonen auf Spatzen geschossen wenn ich nur 2D-Anzeigen basteln will?
Gibt es noch andere Alternativen (zb ne Art schnellere TCanvas) oder eine 2D-Version von OpenGL?
Ansonsten werd ich mich da schonmal reinarbeiten und dann mal schaun was bei rauskommt.
Gibt es eingentlich eine neuere Tabelle mit FSUIPC-Offsets für den FS9? (mit dem ganzen wetter-radar-kruscht usw)
Gruss Phil

MarkusV 07.02.2005 20:08

Hallo Phil,

> Open GL ist ja voll für 3D ausgelegt,
> ist es da nicht mit Kanonen auf Spatzen
> geschossen wenn ich nur 2D-Anzeigen
> basteln will?

Nein. --- Betrachte es andersherum. Eine 3d-Engine kann nur dann sinnvoll funktionieren, wenn sie effizient und schnell ist. Dann aber ist geradezu ideal für deine einfache Anwendung einer rein zweidimensionalen Zeichnung.

> Gibt es noch andere Alternativen
> (zb ne Art schnellere TCanvas) oder
> eine 2D-Version von OpenGL?

Es gibt Alternativen, aber für Delphi meiner Meinung nach keine guten.

Es gibt schnellere Möglichkeiten, in ein Standard-Windows-Fenster zu zeichnen. Alle Methoden, die ich kenne, sind aber Pixelbasiert. Die sind zwar nicht schlecht, aber für ein PFD und ND schlichtweg ungeeignet. Du wirst sehr schnell daraufkommen, daß der große Vorteil von OpenGL ist, daß es ein vektorbasierte Darstellung ist.

Andere Alternativen wären die Methoden, die Microsoft von Haus aus anbietet, insbesondere GTK+ oder DirectX 8 / 9. Der Haken ist aber meiner Meinung nach der: zumindest DirectX ist von Haus aus eine Schnittstelle, die über C++ (oder so ähnlich) angesprochen wird. OpenGL ist im Gegensatz zu OpenGL vollkommen plattform- und hardwareunabhängig (wenn ich Extensions mal vernachlässige) - ein Standard.
Ich bin der Meinung, daß das Interface, also die Programmierschnittstelle von OpenGL sehr angenehm, logisch und sinnvoll aufgebaut ist. Von DirectX konnte ich das damals, als ich mir das genauer betrachtet habe, nicht behaupten. Gerade mit Delphi ist OpenGL auch sehr einfach zu programmieren, da die Schnittstelle anders als bei DirectX gelöst ist.

Insofern halte ich OpenGL für dein Projekt für ideal geeignet.

Viele Grüße,

Markus

dirkan 07.02.2005 21:18

Hallo,

TCanvas ist meist deshalb so langsam, weil der gesamte Bereich neu gepinselt wird. Man kriegt das aber mit ein paar Tricks schnell und flüssig hin.
Ich habe damit mal ein paar Gauges gemacht (mit C++ und GDI). Nachteil: Kantenglättung für Fonts und Linien könnte das Erscheinungsbild erheblich verschönern, kann GDI aber leider nicht.
Performance war kein Problem.

OpenGL enthält etliche Funktionen, die mit dem reinen TCanvas sehr aufwändig sind. Die braucht man in der Regel aber nur, wenn Beleuchtung und 3D Moves benötigt werden.

mbessler 08.02.2005 03:23

Hallo

diesen Link
http://www.antigrain.com/
wollte ich vor ein paar Tagen schon im "Glass Cockpit selberschreiben" Thread posten, hab ihn aber jetzt erst gefunden...

Anti-Grain koennte evtl was sein. Es ist eine 2D Rendering engine fuer C++.

Hat auch Antialiasing, Transparenz und andere interessante Dinge.

Ist OpenSource und fuer mehrere Platformen verfuegbar.

Evtl werde ich X11GC mal darauf portieren... bis ich aber dazu komme ... dass kann noch ne Weile dauern.

Wenn also jemand damit rumspielt... einfach mal berichten.

Manuel

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 06:45 Uhr.

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