PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zu OpenGL


thacrazze
2008-10-27, 20:57:34
Hallo,

habe ein paar Fragen zu OGL

1. Kennt jemand ein gutes Tutorial für C (nicht für C++!)
2. Kann man mit OpenGL auch 2D-Umgebungen wie bei Diablo II programmieren und wie performant ist das?
3. Programmiert man bei OpenGL mit normalerweise mit GLUT? oder mit den offiziellen OpenGL-Headern?

Mfg

Gast
2008-10-27, 21:53:58
Hallo,

habe ein paar Fragen zu OGL

1. Kennt jemand ein gutes Tutorial für C (nicht für C++!)

Willst du dir das wirklich antun? Das ist außer mühsam gar nix, zumindest wenns mans "zu Fuß" machen will. Ansonsten nimmt man GLUT (ist AFAIK C).

2. Kann man mit OpenGL auch 2D-Umgebungen wie bei Diablo II programmieren und wie performant ist das?

Selbstnatürlich. Wie performant das ist hängt stark davon ab wie du das ganze System implementierst, das kann man pauschal nicht beantworten. IMHO ists aber heutzutage einfacher es komplett 3D zu machen und dann halt die Kamera irgendwie bei einer Draufsicht zu fixieren, dann hat man faktisch eine 2D Übersicht bzw. irgendwas isometrisches.

3. Programmiert man bei OpenGL mit normalerweise mit GLUT? oder mit den offiziellen OpenGL-Headern?
Mfg
GLUT != OpenGL. Du kannst GLUT zusätzlich zu den Low-Level OpenGL Befehlen verwenden. Das ist ein miteinander (bzw. eine Erweiterung), kein entweder - oder.

thacrazze
2008-10-27, 22:11:06
Willst du dir das wirklich antun? Das ist außer mühsam gar nix, zumindest wenns mans "zu Fuß" machen will. Ansonsten nimmt man GLUT (ist AFAIK C).
C++ kann ich nicht und will ich auch nicht lernen. Deshalb suche ich ein C Tutorial. Oder eben auch ein GLUT Tutorial. Habe aber gerade gesehen, dass FreeGLUT seit 3 Jahren nicht mehr weiterentwickelt wird.

Selbstnatürlich. Wie performant das ist hängt stark davon ab wie du das ganze System implementierst, das kann man pauschal nicht beantworten. IMHO ists aber heutzutage einfacher es komplett 3D zu machen und dann halt die Kamera irgendwie bei einer Draufsicht zu fixieren, dann hat man faktisch eine 2D Übersicht bzw. irgendwas isometrisches.
Achso, ist eine reine 2D-Oberfläche die mit OpenGL erstellt wurde eigentlich mit der jeweiligen Auflösung skalierbar, weil das ja eine der größten Schwächen vom klassischen 2D ist


GLUT != OpenGL. Du kannst GLUT zusätzlich zu den Low-Level OpenGL Befehlen verwenden. Das ist ein miteinander (bzw. eine Erweiterung), kein entweder - oder.
Ok, was soll ich lieber lernen? GLUT wird ja seit 3 Jahren nicht mehr weiterentwickelt, also lieber reines OGL nehmen oder?

Monger
2008-10-27, 22:45:15
Wohl alle 3D Schnittstellen leben davon, dass man Szenegraphen mit Grafikobjekten bestückt.
Selbst wenn es möglich wäre (wozu mir persönlich ehrlich gesagt die Vorstellungskraft fehlt): so etwas ohne die Mittel einer objektorientierten Sprache zu machen, stelle ich mir ausgesprochen schmerzhaft vor.


Achso, ist eine reine 2D-Oberfläche die mit OpenGL erstellt wurde eigentlich mit der jeweiligen Auflösung skalierbar, weil das ja eine der größten Schwächen vom klassischen 2D ist

Ja, im Prinzip schon. Auch das ganze Problem mit Sichtbarkeit, Beleuchtung, Kollisionserkennung etc. löst sich da automatisch in Luft auf. Das nötige Framework vorausgesetzt, lohnt es sich deshalb oft sogar, ganz klassische 2D Spiele trotzdem durch einen 3D Renderer zu schieben.

thacrazze
2008-10-27, 23:49:55
Wohl alle 3D Schnittstellen leben davon, dass man Szenegraphen mit Grafikobjekten bestückt.
Selbst wenn es möglich wäre (wozu mir persönlich ehrlich gesagt die Vorstellungskraft fehlt): so etwas ohne die Mittel einer objektorientierten Sprache zu machen, stelle ich mir ausgesprochen schmerzhaft vor.
id hat ja die Quake 3 Engine soweit ich weiß komplett in C geschrieben. Auch darauf basierende Engines basieren somit auf C, wie die (verhältnismäßig) grafisch anspruchsvolle Dark Places Engine:
http://www.alientrap.org/nexuiz/screenshots/nexuiz_screenshot_10_thumb.jpg
Also wird das schon möglich sein, zumal OpenGL und die Header selber in C geschrieben sind, soweit ich gehört hab

Aber das tut nix zur Sache, ich suche immer noch nach einem passenden Tutorial. Google ist ja völlig verseucht mit C++-Tutorials, und bei denen steht nicht mal da, dass sie für C++ sind.


Ja, im Prinzip schon. Auch das ganze Problem mit Sichtbarkeit, Beleuchtung, Kollisionserkennung etc. löst sich da automatisch in Luft auf. Das nötige Framework vorausgesetzt, lohnt es sich deshalb oft sogar, ganz klassische 2D Spiele trotzdem durch einen 3D Renderer zu schieben.

Das ist ja cool :)

kloffy
2008-10-28, 00:29:23
Ja, im Prinzip schon. Auch das ganze Problem mit Sichtbarkeit, Beleuchtung, Kollisionserkennung etc. löst sich da automatisch in Luft auf. Das nötige Framework vorausgesetzt, lohnt es sich deshalb oft sogar, ganz klassische 2D Spiele trotzdem durch einen 3D Renderer zu schieben.
Also Kollisionserkennung gehört nicht zu den Dingen, die man mit OpenGL lösen kann. Falls du damit auf Picking hinaus wolltest möchte ich anmerken, dass GL_SELECT nicht mehr supported wird und sehr langsam sein kann.

mekakic
2008-10-28, 07:53:57
id hat ja die Quake 3 Engine soweit ich weiß komplett in C geschrieben
Und gilt als Musterbeispiel für schönen Code ... nicht.
:)
Aber das tut nix zur Sache, ich suche immer noch nach einem passenden Tutorial. Google ist ja völlig verseucht mit C++-Tutorials, und bei denen steht nicht mal da, dass sie für C++ sind.Ich verstehe gerade nicht ganz, was Du meinst. Suchst Du ein Tutorial für eine 3D Engine in C? Weil OpenGL ansich hat ja nix großartig mit C++ oder OOD zu tun. Ob man die klassischen OpenGL-Funktionen jetzt auf Klassen oder Funktionen verteilt, sollte für das Verständnis von OpenGL egal sein. Der Hauptgrund wieso es sowenig C-Tutorials gibt, liegt einfach darin, daß es verständlicherweise kaum jemand will - C wird doch eigentlich nur noch im Embedded-Bereich (und auch da nimmt C++ deutlich zu) und im sicherheitskritischen Bereich verwendet, wo es auf Jahrhundertedauernde Zertifizierung von Compilern ankommt und man noch nix besseres hat.

RMC
2008-10-28, 10:38:23
Also Kollisionserkennung gehört nicht zu den Dingen, die man mit OpenGL lösen kann. Falls du damit auf Picking hinaus wolltest möchte ich anmerken, dass GL_SELECT nicht mehr supported wird und sehr langsam sein kann.

Ich galube er meinte, dass ein Kollisionsberechnung in der dritten Dimension sämtliche Probleme bei einer 2D Darstellung eliminiert.

Bei einer Berechnung im 3D Raum (Beleuchtung, Kollision, Sichtweite) muss nichts aufgrund der Darstellung angepasst werden (2D, 2.5D) und die Kamera (bzw. Projektion) kann man nachher natürlich perspektivisch oder orthogonal einstellen wie man will. Die Berechnung wird immer stimmen.

Die Kollisionserkennung ist vollkommen unabhängig vom Renderer ;)

Gast
2008-10-28, 14:44:25
Und gilt als Musterbeispiel für schönen Code ... nicht.
:)
Ich verstehe gerade nicht ganz, was Du meinst. Suchst Du ein Tutorial für eine 3D Engine in C?
Ich suche ein Tutorial wie man mit OpenGL in C programmieren lernt.

Katano
2008-10-28, 15:42:36
Also erstmal vorweg:
Alle guten C++ Tutorials sollten dich erstmal in die Programmierung mit C einführen. Warum? Weil C++ eine erweiterung ist und die Grundlagen erstmal identisch sind. Klar gibt es neue coole Befehle und möglichkeiten, aber das sind alles Arbeitserleichterungen. Und ob du nu nen printf("Bla"); oder nen cout << "Bla"; machst is doch schnuppe (letzteres is halt einfach bequemer). Und wenn du keine Klassen etc. willst, dann lass sie weg :)

Weiter würde ich dir empfehlen SDL zu benutzen. Klar ist OpenGL nativ performanter, aber SDL ist meiner Ansicht nach sehr gut für nen Einstieg gedacht, da man mit dem gleichen Layer auch Maus, Tastatur und Sound ansteuern kann.

C++ Tutorial:
http://tutorial.schornboeck.net/inhalt.htm

SDL Tutorial:
http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/tut1

Gast
2008-10-28, 15:44:47
Ich suche ein Tutorial wie man mit OpenGL in C programmieren lernt.
so:

glBegin(GL_TRIANGLES);
for (i=0; i<number_of_triangles; i++)
{
glVertex3f(triangle[i].x,triangle[i].y,triangle[i].z);
}
glEnd();
glSwapBuffers();

Wenn du hingegen wissen willst wie man in C an ein Fenster rankommt in das man zeichnen kann, wie man die Tastatur und Maus abfragt usw. dann hat das mit OpenGL nichts zu tun. Dafür solltest du dich mit Windowmanagement beschäftigen (unter Linux X11, unter Windows win32/64). Das wird in C seeehr schmerzhaft werden. Tu dir einen Gefallen und machs in C++ oder noch besser in einer Sprache in der man sich nicht so leicht wehtut. Java/C# oder so. Auf alle Fälle wirst du ohne objektorientierte Programmierung versumpfen.

eXistence
2008-10-28, 16:01:46
es gibt eine ältere Version des Red Books online:

http://www.glprogramming.com/red/

Alles da drin ist reiner C-Code. Die Techniken, die im Red Book beschrieben sind, sind war nicht unbedingt state-of-the-art (in dieser alten Version schon garnicht), aber um mal reinzuschnuppern reichts.

Gast
2008-10-28, 23:59:42
so:

glBegin(GL_TRIANGLES);
for (i=0; i<number_of_triangles; i++)
{
glVertex3f(triangle[i].x,triangle[i].y,triangle[i].z);
}
glEnd();
glSwapBuffers();

Wenn du hingegen wissen willst wie man in C an ein Fenster rankommt in das man zeichnen kann, wie man die Tastatur und Maus abfragt usw. dann hat das mit OpenGL nichts zu tun. Dafür solltest du dich mit Windowmanagement beschäftigen (unter Linux X11, unter Windows win32/64). in diese Kategorie fällt das Swappen des Buffers ebenfalls. Eine OpenGL-Funktion glSwapBuffers() gibt es nicht.


Das wird in C seeehr schmerzhaft werden. Tu dir einen Gefallen und machs in C++ oder noch besser in einer Sprache in der man sich nicht so leicht wehtut. Java/C# oder so. Auf alle Fälle wirst du ohne objektorientierte Programmierung versumpfen.ob das schmerzhaft wird, hängt weniger von der Objektorientierung ab als von der GUI-API. GLUT oder SDL sind C-APIs, aber trotzdem sehr einfach zu programmieren, und für OpenGL-Programme völlig ausreichend. Dass es mit Java oder C# vergleichweise einfach geht, liegt weniger an den Sprachen selbst als an den APIs die sie mitbringen. Eine vergleichbare API für C++ wäre z.B. QT.

thacrazze
2008-10-29, 20:52:29
Danke an euch, werde mich daran mal versuchen.

Gast
2008-10-29, 22:27:26
in diese Kategorie fällt das Swappen des Buffers ebenfalls. Eine OpenGL-Funktion glSwapBuffers() gibt es nicht.

Nagut, hast mich erwischt. :)

ob das schmerzhaft wird, hängt weniger von der Objektorientierung ab als von der GUI-API. GLUT oder SDL sind C-APIs, aber trotzdem sehr einfach zu programmieren, und für OpenGL-Programme völlig ausreichend. Dass es mit Java oder C# vergleichweise einfach geht, liegt weniger an den Sprachen selbst als an den APIs die sie mitbringen. Eine vergleichbare API für C++ wäre z.B. QT.
Das meine ich doch damit, eine C API ist schon prinzipiell komplizierter als was objektorientiertes. Mir fällt auf die schnelle keine ordentliche GUI-API ein die nicht objektorientiert wäre (nein, GLUT ist keine ordentliche GUI API).

kloffy
2008-10-29, 23:33:52
Grad durch Zufall drauf gestoßen, vielleicht hilfts ja (auch wenn's nicht gerade aktuell ist): glBASE (http://www.futurenation.net/glbase/index.php).
glBase is a framework for developing simple OpenGL applications. It uses GLUT, so it should be fairly portable. [...] glBase is written in 'straight' C using the free compiler/IDE LCC-Win32.

thacrazze
2008-10-29, 23:48:04
Grad durch Zufall drauf gestoßen, vielleicht hilfts ja (auch wenn's nicht gerade aktuell ist): glBASE (http://www.futurenation.net/glbase/index.php).
Leider scheint das seit 2002 nicht mehr weiterentwickelt zu werden.
Nagut, hast mich erwischt. :)
Einen Gast kann man leider nicht erwischen^^

kloffy
2008-10-30, 00:02:06
Leider scheint das seit 2002 nicht mehr weiterentwickelt zu werden.
Naja, das wird wohl immer so sein, wenn man auf C eingeschränkt ist. Heißt ja nicht das es deswegen schlecht sein muss...

Gast
2008-10-30, 15:55:46
Das meine ich doch damit, eine C API ist schon prinzipiell komplizierter als was objektorientiertes. Mir fällt auf die schnelle keine ordentliche GUI-API ein die nicht objektorientiert wäre (nein, GLUT ist keine ordentliche GUI API).das sagte ich doch: für ein OpenGL-Programm ist GLUT als GUI-API ausreichend. Aufwändigere GUIs kriegt man damit nicht hin, das ist schon klar.

Ganon
2008-10-30, 16:18:35
Man wird sich aber freuen wenn man eine GUI-API hat, die einem nebenbei noch JPEGs usw. in Texturen wandelt, mit einem Funktionsaufruf :D

Von daher würde ich dann doch eher SDL vorschlagen ;)

Gast
2008-10-30, 20:05:41
Man wird sich aber freuen wenn man eine GUI-API hat, die einem nebenbei noch JPEGs usw. in Texturen wandelt, mit einem Funktionsaufruf :D

Von daher würde ich dann doch eher SDL vorschlagen ;)
Aber noch besser wärs wenn man auch gleich noch all die bunten Knöppe und Schaltflächen hätte, ganz zu schweigen von Netzwerk, Scripting, SVG, XML kann man auch gleich mal brauchen....
Von daher am besten gleich QT, das ist modern und kann eigentlich alles. Vor allem da man mit SDL eben noch keine GUI hat, damit kriegt man nur Multimedia. (Multimedia-API, nicht GUI-API)

Gast
2008-10-31, 17:42:30
Man wird sich aber freuen wenn man eine GUI-API hat, die einem nebenbei noch JPEGs usw. in Texturen wandelt, mit einem Funktionsaufruf :D

Von daher würde ich dann doch eher SDL vorschlagen ;)für Texturen braucht's keine GUI-API. Man kann z.B. Texturen mit SDL_Image laden, ohne dafür SDL für die GUI zu benutzen.
Unter Windows darf man dann nur das #undef main nicht vergessen.

thacrazze
2008-10-31, 18:20:23
Die C-Tutorials sind alle nich brauchbar.

Meint ihr das es sich lohnt C++ zu lernen? Wie steht es eigentl. mit Qt + OpenGL? Das Buch ist nicht das Problem, da zwei C++ Bücher zu Hause liegen habe.

Naja, erstmal lerne ich Java und dann wahrscheinlich JOGL

Gast
2008-10-31, 18:38:59
Meint ihr das es sich lohnt C++ zu lernen? Wie steht es eigentl. mit Qt + OpenGL? es gibt in QT schon eine QGLWidget-Klasse, damit kann man sehr komfortabel Fenster für die OpenGL-Grafikausgabe erzeugen:

http://doc.trolltech.com/3.3/qglwidget.html

thacrazze
2008-10-31, 19:14:38
es gibt in QT schon eine QGLWidget-Klasse, damit kann man sehr komfortabel Fenster für die OpenGL-Grafikausgabe erzeugen:

http://doc.trolltech.com/3.3/qglwidget.html
Du meinst wohl: http://doc.trolltech.com/4.4/qtopengl.html

Und hat man damit auch alle Features von OpenGL 2.1 und kann z.B. einen Shooter machen?

Gast
2008-11-01, 13:47:59
Du meinst wohl: http://doc.trolltech.com/4.4/qtopengl.html

Und hat man damit auch alle Features von OpenGL 2.1 und kann z.B. einen Shooter machen?
Ja. Qt machts nur einfacher ein Fenster zu bekommen, an OpenGL ist das nur insofern gekoppelt dass du in das Fenster dann halt mit GL Befehlen reinzeichnen kannst. Die OpenGL Version ist davon unabhängig, die wird von Treiber bestimmt und nicht vom GUI Toolkit.

eXistence
2008-11-01, 16:27:32
Du meinst wohl: http://doc.trolltech.com/4.4/qtopengl.html

Und hat man damit auch alle Features von OpenGL 2.1 und kann z.B. einen Shooter machen?

Wie der Gast über mir schon sagte, Qt hat von 3D keine Ahnung, alles was Qt dir bietet ist - stark vereinfacht - eine Art Fläche in die du deine 3D-Sachen reinrendern kannst. Die Funktionen von Qt sind sehr hilfreich wenn du deine 3D-Sachen in ein "normales" Fenster-Programm einbinden willst (wenn du z.B. CAD-software oder so entwickelst). Für Spiele die sowieso fullscreen laufen (und die keine normalen Fenster/GUI-Elemente haben) ist die Integration in eine normale Fenster-Anwendung i.d.R nicht so wichtig.

Ich glaube dir fehlt noch son bissel das Grundverständnis was OpenGL eigentlich ausmacht und wie eine 3D-Engine funktioniert.

Wie ich weiter oben schon mal erwähnte, solltest du dir das hier mal angucken:
http://www.glprogramming.com/red/chapter01.html

Das ist so ziemlich das einfachste und primitivste was man machen kann (ist übrigens reines C, kein C++), nur damit du mal ne Vorstellung davon bekommst wie OpenGL überhaupt funktioniert.

Alternativ könntest du dir auch fertige engines angucken, aber ohne das Grundwissen und ohne C++-Kentnisse wirst du da nicht weit kommen...

Gast
2008-11-03, 03:50:28
C++ kann ich nicht und will ich auch nicht lernen.

Man kann C++ ganz gut zu C Code vergewaltigen, da C++ alle Features von C89 beherrscht.

D.h. nutze C++ und programmiere einfach wie gehabt in C Style Code.

Ich hoffe das C++ Coder hier jetzt nicht mitlesen, wenn ich jemandem empfehle C++ zu vergewaltigen. *Duck und wech*



Achso, ist eine reine 2D-Oberfläche die mit OpenGL erstellt wurde eigentlich mit der jeweiligen Auflösung skalierbar, weil das ja eine der größten Schwächen vom klassischen 2D ist

Keine Ahnung.
Tatsache ist aber, daß du mit 3d einige Effekte Gratis bekommst.

Nimm als Beispiel einfach mal das drehen einer Figur um 360° aus einer Isometrischen 3d Sicht.
Bei echtem 2d müßtest du für jeden Bewegungswinkel die Figur per Hand im Bildbearbeitungsprogramm neu erstellen, oder zumindest im Rendering Programm rendern (aber dann wäre die Figur ja eh schon als 3d Modell vorhanden).
Bei 45° Schritten wären das also 8 Bilder der Figur und wenn sie sich im Spiel dann dreht, dann sieht das extrem ruckelig aus.
Mit einem echten 3d Modell in einer 3d Welt ist die Drehung dagegen immer flüssig.


Weitere Vorteile in der 3d Welt währen z.b. Flugbahnberechnungen von Geschossen.
In der 2d Welt müßtest du das händisch hinbiegen, so daß es noch akzeptabel aussieht.
In einer 3d Welt ist es immer perspektivisch korrekt, ganz ohne nennenswerten Aufwand.

Ich würde das also an deiner Stelle alles in 3d machen und die Sicht fixieren, falls du es in einem Isometrischen Retro-Stil haben möchtest.


Ok, was soll ich lieber lernen? GLUT wird ja seit 3 Jahren nicht mehr weiterentwickelt, also lieber reines OGL nehmen oder?

Du kannst SDL mit OpenGL kombinieren.
Für die reinen Grafikfunktionen nutzt du dann natürich OpenGL direkt,
aber für den Rest, Threads, Input etc. was ja Glut auch kann, nimmst du die SDL.

Die SDL ist übrigens in C, wird dir also gefallen.

Gast
2008-11-04, 14:31:21
Wie der Gast über mir schon sagte, Qt hat von 3D keine Ahnung, alles was Qt dir bietet ist - stark vereinfacht - eine Art Fläche in die du deine 3D-Sachen reinrendern kannst. um das mal mit dem Zusammenspiel anderer GUI-APIs mit OpenGL, etwa Win32+WGL, zu vergleichen: so ein QGLWidget ist praktisch ein Fenster, für das der OpenGL-Renderingkontext (den man bei Win32 noch so umständlich mit den wgl-Funktionen anlegen muss) schon fertig erstellt ist.